holidays 0.47__py3-none-any.whl → 0.49__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. holidays/__init__.py +1 -1
  2. holidays/calendars/gregorian.py +31 -7
  3. holidays/calendars/persian.py +3 -2
  4. holidays/calendars/thai.py +24 -20
  5. holidays/countries/__init__.py +1 -0
  6. holidays/countries/angola.py +2 -2
  7. holidays/countries/aruba.py +2 -3
  8. holidays/countries/australia.py +1 -3
  9. holidays/countries/belgium.py +1 -2
  10. holidays/countries/bolivia.py +1 -2
  11. holidays/countries/brazil.py +1 -2
  12. holidays/countries/cambodia.py +7 -8
  13. holidays/countries/canada.py +2 -1
  14. holidays/countries/chile.py +6 -6
  15. holidays/countries/colombia.py +1 -2
  16. holidays/countries/curacao.py +3 -4
  17. holidays/countries/cyprus.py +1 -2
  18. holidays/countries/denmark.py +1 -2
  19. holidays/countries/finland.py +3 -3
  20. holidays/countries/france.py +1 -2
  21. holidays/countries/greece.py +11 -6
  22. holidays/countries/hongkong.py +398 -133
  23. holidays/countries/israel.py +13 -13
  24. holidays/countries/italy.py +2 -4
  25. holidays/countries/japan.py +17 -6
  26. holidays/countries/jersey.py +2 -2
  27. holidays/countries/laos.py +7 -23
  28. holidays/countries/madagascar.py +2 -3
  29. holidays/countries/malaysia.py +545 -235
  30. holidays/countries/moldova.py +1 -2
  31. holidays/countries/netherlands.py +2 -3
  32. holidays/countries/new_zealand.py +10 -11
  33. holidays/countries/palau.py +127 -0
  34. holidays/countries/portugal.py +2 -6
  35. holidays/countries/saudi_arabia.py +2 -3
  36. holidays/countries/south_korea.py +18 -5
  37. holidays/countries/sweden.py +2 -3
  38. holidays/countries/switzerland.py +2 -3
  39. holidays/countries/timor_leste.py +23 -1
  40. holidays/countries/united_states.py +1 -1
  41. holidays/countries/uruguay.py +3 -4
  42. holidays/financial/__init__.py +1 -0
  43. holidays/financial/ice_futures_europe.py +47 -0
  44. holidays/financial/ny_stock_exchange.py +17 -4
  45. holidays/groups/chinese.py +2 -3
  46. holidays/groups/christian.py +18 -19
  47. holidays/groups/international.py +10 -0
  48. holidays/groups/islamic.py +2 -2
  49. holidays/groups/persian.py +2 -2
  50. holidays/helpers.py +9 -3
  51. holidays/holiday_base.py +133 -66
  52. holidays/locale/en_US/LC_MESSAGES/MY.mo +0 -0
  53. holidays/locale/en_US/LC_MESSAGES/MY.po +250 -0
  54. holidays/locale/ms_MY/LC_MESSAGES/MY.mo +0 -0
  55. holidays/locale/ms_MY/LC_MESSAGES/MY.po +250 -0
  56. holidays/mixins.py +31 -0
  57. holidays/observed_holiday_base.py +25 -13
  58. holidays/registry.py +2 -0
  59. {holidays-0.47.dist-info → holidays-0.49.dist-info}/METADATA +29 -21
  60. {holidays-0.47.dist-info → holidays-0.49.dist-info}/RECORD +64 -57
  61. {holidays-0.47.dist-info → holidays-0.49.dist-info}/AUTHORS +0 -0
  62. {holidays-0.47.dist-info → holidays-0.49.dist-info}/LICENSE +0 -0
  63. {holidays-0.47.dist-info → holidays-0.49.dist-info}/WHEEL +0 -0
  64. {holidays-0.47.dist-info → holidays-0.49.dist-info}/top_level.txt +0 -0
@@ -11,22 +11,35 @@
11
11
  # License: MIT (see LICENSE file)
12
12
 
13
13
  from datetime import date
14
- from datetime import timedelta as td
15
- from typing import Optional
16
-
17
- from holidays.calendars.gregorian import JUL, AUG, SEP, MON, SUN, _get_nth_weekday_of_month
14
+ from typing import Tuple
15
+
16
+ from holidays.calendars.gregorian import (
17
+ JAN,
18
+ MAY,
19
+ JUN,
20
+ JUL,
21
+ AUG,
22
+ SEP,
23
+ OCT,
24
+ DEC,
25
+ SUN,
26
+ _timedelta,
27
+ CHRISTMAS,
28
+ WINTER_SOLSTICE,
29
+ )
30
+ from holidays.constants import OPTIONAL, PUBLIC
18
31
  from holidays.groups import (
19
32
  ChineseCalendarHolidays,
20
33
  ChristianHolidays,
21
34
  InternationalHolidays,
22
35
  StaticHolidays,
23
36
  )
37
+ from holidays.mixins import PreferredDiscretionaryHolidays
24
38
  from holidays.observed_holiday_base import (
25
39
  ObservedHolidayBase,
26
- WORKDAY_TO_NEXT_WORKDAY,
27
- MON_TO_NEXT_TUE,
28
- SUN_TO_NEXT_WORKDAY,
29
40
  SAT_SUN_TO_NEXT_WORKDAY,
41
+ SUN_TO_NEXT_WORKDAY,
42
+ WORKDAY_TO_NEXT_WORKDAY,
30
43
  )
31
44
 
32
45
 
@@ -35,176 +48,386 @@ class HongKong(
35
48
  ChineseCalendarHolidays,
36
49
  ChristianHolidays,
37
50
  InternationalHolidays,
51
+ PreferredDiscretionaryHolidays,
38
52
  StaticHolidays,
39
53
  ):
40
54
  """
41
- https://en.wikipedia.org/wiki/Public_holidays_in_Hong_Kong
42
- Holidays for 2007–2023 (government source):
43
- https://www.gov.hk/en/about/abouthk/holiday/index.htm
55
+ References:
56
+ - `English Wikipedia <https://en.wikipedia.org/wiki/Public_holidays_in_Hong_Kong>`_
57
+ - `Chinese Wikipedia <https://zh.wikipedia.org/wiki/香港節日與公眾假期>`_
58
+ Statutory Holidays:
59
+ - `Section 39 of Cap. 57 Employment Ordinance <https://www.elegislation.gov.hk/hk/cap57!en-zh-Hant-HK?INDEX_CS=N&xpid=ID_1438403463460_002>`_ # noqa: E501
60
+ - `Holidays for 2010-2024 <https://www.labour.gov.hk/eng/news/holidays_list.htm>`_
61
+ General Holidays:
62
+ - `Cap. 149 General Holidays Ordinance <https://www.elegislation.gov.hk/hk/cap149!en-zh-Hant-HK?INDEX_CS=N>`_ # noqa: E501
63
+ - `Holidays for 2007–2024 <https://www.gov.hk/en/about/abouthk/holiday/index.htm>`_
44
64
  """
45
65
 
46
66
  country = "HK"
47
- observed_label = "The day following %s"
67
+ default_preferred_discretionary_holidays = (CHRISTMAS,)
68
+ # %s(慶祝).
69
+ observed_label = "%s (observed)"
70
+ supported_categories = (OPTIONAL, PUBLIC)
71
+ weekend = {SUN}
48
72
 
49
73
  def __init__(self, *args, **kwargs):
50
74
  ChineseCalendarHolidays.__init__(self)
51
75
  ChristianHolidays.__init__(self)
52
76
  InternationalHolidays.__init__(self)
77
+ PreferredDiscretionaryHolidays.__init__(
78
+ self, kwargs.pop("preferred_discretionary_holidays", None)
79
+ )
53
80
  StaticHolidays.__init__(self, HongKongStaticHolidays)
54
81
  kwargs.setdefault("observed_rule", SUN_TO_NEXT_WORKDAY)
55
82
  super().__init__(*args, **kwargs)
56
83
 
57
- def _add_holiday(self, name: str, *args) -> Optional[date]:
58
- dt = args if len(args) > 1 else args[0]
59
- dt = dt if isinstance(dt, date) else date(self._year, *dt)
60
- rule = (
61
- WORKDAY_TO_NEXT_WORKDAY + SAT_SUN_TO_NEXT_WORKDAY
62
- if dt in self
63
- else self._observed_rule
64
- )
65
- is_obs, dt_observed = self._add_observed(dt, name=name, rule=rule)
66
- return dt_observed if is_obs else super()._add_holiday(name, dt) # type: ignore[arg-type]
67
-
68
- def _populate_public_holidays(self):
69
- # Current set of holidays actually valid since 1946
70
- if self._year <= 1945:
71
- return None
84
+ def _add_mid_autumn(self) -> date:
85
+ # Chinese Mid-Autumn Festival.
72
86
 
73
- self.weekend = {SUN}
87
+ mid_autumn_date = self._mid_autumn_festival
88
+ if self._year >= 1968:
89
+ mid_autumn_date = _timedelta(mid_autumn_date, +1)
90
+ # 中秋節翌日.
91
+ name = "The day following the Chinese Mid-Autumn Festival"
92
+ # 中秋節後第二日.
93
+ second_name = "The second day following the Chinese Mid-Autumn Festival"
94
+ else:
95
+ # 中秋節.
96
+ name = "Chinese Mid-Autumn Festival"
97
+ second_name = "The day following the Chinese Mid-Autumn Festival"
74
98
 
75
- # The first day of January
76
- self._add_new_years_day("The first day of January")
99
+ if self._is_sunday(mid_autumn_date):
100
+ if 1983 <= self._year <= 2010:
101
+ self._add_holiday("Chinese Mid-Autumn Festival", _timedelta(mid_autumn_date, -1))
102
+ else:
103
+ self._add_holiday(second_name, _timedelta(mid_autumn_date, +1))
104
+ else:
105
+ self._add_holiday(name, mid_autumn_date)
106
+ return mid_autumn_date
77
107
 
78
- # Lunar New Year
108
+ def _add_lunar_new_year(self, day_three_start_year: int):
109
+ # Lunar New Year.
110
+ # 農曆年初一.
79
111
  name = "Lunar New Year's Day"
112
+ # 農曆年初一的前一日.
80
113
  preceding_day_lunar = "The day preceding Lunar New Year's Day"
114
+ # 農曆年初二.
81
115
  second_day_lunar = "The second day of Lunar New Year"
116
+ # 農曆年初三.
82
117
  third_day_lunar = "The third day of Lunar New Year"
118
+ # 農曆年初四.
83
119
  fourth_day_lunar = "The fourth day of Lunar New Year"
84
120
  dt_lunar_new_year = self._chinese_new_year
85
- if self.observed:
86
- if self._is_sunday(dt_lunar_new_year):
87
- if self._year in {2006, 2007, 2010}:
88
- self._add_chinese_new_years_eve(preceding_day_lunar)
89
- else:
121
+ if self._year >= 1983:
122
+ if (
123
+ self._is_friday(dt_lunar_new_year)
124
+ or self._is_saturday(dt_lunar_new_year)
125
+ or self._is_sunday(dt_lunar_new_year)
126
+ ):
127
+ if self._year >= 2012:
90
128
  self._add_chinese_new_years_day_four(fourth_day_lunar)
91
- else:
129
+ else:
130
+ self._add_chinese_new_years_eve(preceding_day_lunar)
131
+
132
+ if not self._is_sunday(dt_lunar_new_year):
92
133
  self._add_chinese_new_years_day(name)
93
- if self._is_saturday(dt_lunar_new_year):
94
- self._add_chinese_new_years_day_four(fourth_day_lunar)
95
- else:
134
+
135
+ if not self._is_saturday(dt_lunar_new_year):
96
136
  self._add_chinese_new_years_day_two(second_day_lunar)
97
- if self._is_friday(dt_lunar_new_year):
98
- self._add_chinese_new_years_day_four(fourth_day_lunar)
99
- else:
137
+
138
+ if not self._is_friday(dt_lunar_new_year):
100
139
  self._add_chinese_new_years_day_three(third_day_lunar)
101
140
  else:
102
141
  self._add_chinese_new_years_day(name)
103
142
  self._add_chinese_new_years_day_two(second_day_lunar)
104
- self._add_chinese_new_years_day_three(third_day_lunar)
105
-
106
- # Ching Ming Festival
107
- name = "Ching Ming Festival"
108
- dt_qingming = self._qingming_date
109
- if self.observed and dt_qingming == self._easter_sunday + td(days=+1):
110
- self._add_observed(dt_qingming, name=name, rule=MON_TO_NEXT_TUE)
111
- elif dt_qingming not in {
112
- self._easter_sunday + td(days=-2),
113
- self._easter_sunday + td(days=-1),
114
- }:
115
- self._add_holiday(name, dt_qingming)
116
-
117
- # Easter Holiday
118
- good_friday = "Good Friday"
119
- easter_monday = "Easter Monday"
120
- self._add_good_friday(good_friday)
121
- self._add_holy_saturday(self.observed_label % good_friday)
122
- self._add_easter_monday(easter_monday)
123
-
124
- if dt_qingming in {
125
- self._easter_sunday + td(days=-2),
126
- self._easter_sunday + td(days=-1),
127
- }:
128
- super()._add_holiday(name, dt_qingming)
143
+ if self._year >= day_three_start_year:
144
+ self._add_chinese_new_years_day_three(third_day_lunar)
145
+
146
+ def _populate_public_holidays(self):
147
+ # Statutory Holidays.
148
+
149
+ # Industrial Employment Ordinance implemented in April 1962.
150
+ if self._year <= 1962:
151
+ return None
152
+
153
+ # The first day of January.
154
+ # 一月一日.
155
+ if self._year >= 1977:
156
+ self._add_observed(self._add_new_years_day("The first day of January"))
157
+
158
+ self._add_lunar_new_year(day_three_start_year=1977)
159
+
160
+ # Good Friday.
161
+ # 耶穌受難節.
162
+ if self._year >= 2028:
163
+ self._add_good_friday("Good Friday")
164
+
165
+ # The day following Good Friday.
166
+ # 耶穌受難節翌日.
167
+ if self._year >= 2030:
168
+ self._add_holy_saturday("The day following Good Friday")
169
+
170
+ # Easter Monday.
171
+ # 復活節星期一.
172
+ if self._year >= 2026:
173
+ self._add_easter_monday("Easter Monday")
129
174
 
175
+ # Ching Ming Festival.
176
+ # 清明節.
177
+ self._add_observed(self._add_qingming_festival("Ching Ming Festival"))
178
+
179
+ # The Birthday of the Buddha.
180
+ # 佛誕.
181
+ if self._year >= 2022:
182
+ self._add_observed(self._add_chinese_birthday_of_buddha("The Birthday of the Buddha"))
183
+
184
+ # Labour Day.
185
+ # 勞動節.
130
186
  if self._year >= 1999:
131
- # The Birthday of the Buddha
132
- self._add_chinese_birthday_of_buddha("The Birthday of the Buddha")
187
+ self._add_observed(self._add_labor_day("Labour Day"))
188
+
189
+ # Tuen Ng Festival.
190
+ # 端午節.
191
+ self._add_observed(self._add_dragon_boat_festival("Tuen Ng Festival"))
192
+
193
+ # Hong Kong Special Administrative Region Establishment Day.
194
+ # 香港特別行政區成立紀念日.
195
+ if self._year >= 1997:
196
+ self._add_observed(
197
+ self._add_holiday_jul_1(
198
+ "Hong Kong Special Administrative Region Establishment Day"
199
+ )
200
+ )
133
201
 
134
- # Labour Day
135
- self._add_labor_day("Labour Day")
202
+ mid_autumn_date = self._add_mid_autumn()
136
203
 
137
- # Tuen Ng Festival
138
- self._add_dragon_boat_festival("Tuen Ng Festival")
204
+ # Chung Yeung Festival.
205
+ # 重陽節.
206
+ if self._year >= 1977:
207
+ dt_double_ninth = self._add_double_ninth_festival("Chung Yeung Festival")
208
+ self._add_observed(dt_double_ninth)
139
209
 
140
- # Hong Kong Special Administrative Region Establishment Day
210
+ # National Day.
211
+ # 國慶日.
141
212
  if self._year >= 1997:
142
- self._add_holiday_jul_1("Hong Kong Special Administrative Region Establishment Day")
213
+ name = "National Day"
214
+ oct_1 = self._add_holiday_oct_1(name)
215
+ self._add_observed(
216
+ oct_1,
217
+ name=name,
218
+ rule=WORKDAY_TO_NEXT_WORKDAY + SAT_SUN_TO_NEXT_WORKDAY
219
+ if oct_1 == mid_autumn_date or oct_1 == dt_double_ninth
220
+ else SUN_TO_NEXT_WORKDAY,
221
+ )
143
222
 
144
- # Chinese Mid-Autumn Festival
145
- name = "Chinese Mid-Autumn Festival"
146
- mid_autumn_date = self._mid_autumn_festival
147
- if self.observed:
148
- # if Chinese Mid-Autumn Festival lies on Saturday
149
- # before 1983 public holiday lies on Monday
150
- # from 1983 to 2010 public holiday lies on same day
151
- # since 2011 public holiday lies on Monday
152
- if self._is_saturday(mid_autumn_date):
153
- if 1983 <= self._year <= 2010:
154
- self._add_mid_autumn_festival(name)
155
- else:
156
- self._add_holiday(
157
- f"The second day of the {name} (Monday)", mid_autumn_date + td(days=+2)
158
- )
223
+ # Chinese Winter Solstice Festival.
224
+ # 冬節.
225
+ if WINTER_SOLSTICE in self.preferred_discretionary_holidays:
226
+ self._add_observed(
227
+ self._add_holiday("Chinese Winter Solstice Festival", self._winter_solstice_date)
228
+ )
229
+
230
+ if self._year >= 2024:
231
+ # 聖誕節後第一個周日.
232
+ self._add_observed(
233
+ self._add_christmas_day_two("The first weekday after Christmas Day")
234
+ )
235
+
236
+ # Christmas Day.
237
+ # 聖誕節.
238
+ if CHRISTMAS in self.preferred_discretionary_holidays:
239
+ self._add_observed(self._add_christmas_day("Christmas Day"))
240
+
241
+ def _populate_optional_holidays(self):
242
+ if self._year <= 1945:
243
+ return None
244
+
245
+ # General Holidays.
246
+
247
+ # The first day of January.
248
+ if self._is_sunday(JAN, 1):
249
+ # 一月一日翌日.
250
+ self._add_new_years_day_two("The day following the first day of January")
251
+ else:
252
+ # 一月一日.
253
+ self._add_new_years_day("The first day of January")
254
+
255
+ self._add_lunar_new_year(day_three_start_year=1968)
256
+
257
+ # Ching Ming Festival.
258
+ if self._year >= 1968:
259
+ dt_qingming = self._qingming_date
260
+ if self._is_sunday(dt_qingming) or dt_qingming == _timedelta(self._easter_sunday, +1):
261
+ # 清明節翌日.
262
+ self._add_holiday(
263
+ "The day following Ching Ming Festival", _timedelta(dt_qingming, +1)
264
+ )
159
265
  else:
160
- self._add_mid_autumn_festival_day_two(f"The day following the {name}")
266
+ # 清明節.
267
+ self._add_qingming_festival("Ching Ming Festival")
268
+
269
+ # Good Friday.
270
+ # 耶穌受難節.
271
+ self._add_good_friday("Good Friday")
272
+
273
+ # The day following Good Friday.
274
+ # 耶穌受難節翌日.
275
+ self._add_holy_saturday("The day following Good Friday")
276
+
277
+ # Easter Monday.
278
+ if self._year >= 1968 and dt_qingming == self._easter_sunday:
279
+ # 復活節星期一翌日.
280
+ self._add_holiday_2_days_past_easter("The day following Easter Monday")
161
281
  else:
162
- self._add_mid_autumn_festival_day_two(name)
282
+ # 復活節星期一.
283
+ self._add_easter_monday("Easter Monday")
163
284
 
164
- # Chung Yeung Festival
165
- self._add_double_ninth_festival("Chung Yeung Festival")
285
+ # The Birthday of the Buddha.
286
+ if self._year >= 1999:
287
+ dt_birthday_of_buddha = self._chinese_calendar.buddha_birthday_date(self._year)[0]
288
+ if self._is_sunday(dt_birthday_of_buddha):
289
+ # 佛誕翌日.
290
+ self._add_holiday(
291
+ "The day following the Birthday of the Buddha",
292
+ _timedelta(dt_birthday_of_buddha, +1),
293
+ )
294
+ else:
295
+ # 佛誕.
296
+ self._add_chinese_birthday_of_buddha("The Birthday of the Buddha")
166
297
 
167
- # National Day
168
- if self._year >= 1997:
169
- self._add_holiday_oct_1("National Day")
298
+ # Labour Day.
299
+ if self._year >= 1999:
300
+ if self._is_sunday(MAY, 1):
301
+ # 勞動節翌日.
302
+ self._add_labor_day_two("The day following Labour Day")
303
+ else:
304
+ # 勞動節.
305
+ self._add_labor_day("Labour Day")
306
+
307
+ # Tuen Ng Festival.
308
+ if self._year >= 1968:
309
+ dt_dragon_boat = self._chinese_calendar.dragon_boat_date(self._year)[0]
310
+ if self._is_sunday(dt_dragon_boat):
311
+ # 端午節翌日.
312
+ self._add_holiday(
313
+ "The day following Tuen Ng Festival", _timedelta(dt_dragon_boat, +1)
314
+ )
315
+ else:
316
+ # 端午節.
317
+ self._add_dragon_boat_festival("Tuen Ng Festival")
170
318
 
171
- if self._year <= 1998:
172
- self._add_holiday_oct_2("National Day")
319
+ # Hong Kong Special Administrative Region Establishment Day.
320
+ if self._year >= 1997:
321
+ if self._is_sunday(JUL, 1):
322
+ # 香港特別行政區成立紀念日翌日.
323
+ self._add_holiday_jul_2(
324
+ "The day following Hong Kong Special Administrative Region Establishment Day"
325
+ )
326
+ else:
327
+ # 香港特別行政區成立紀念日.
328
+ self._add_holiday_jul_1(
329
+ "Hong Kong Special Administrative Region Establishment Day"
330
+ )
331
+
332
+ mid_autumn_date = self._add_mid_autumn()
333
+
334
+ # Chung Yeung Festival.
335
+ if self._year >= 1968:
336
+ dt_double_ninth = self._chinese_calendar.double_ninth_date(self._year)[0]
337
+ if self._is_sunday(dt_double_ninth):
338
+ # 重陽節翌日.
339
+ self._add_holiday(
340
+ "The day following Chung Yeung Festival", _timedelta(dt_double_ninth, +1)
341
+ )
342
+ else:
343
+ # 重陽節.
344
+ self._add_double_ninth_festival("Chung Yeung Festival")
173
345
 
174
- # Christmas Day
346
+ # National Day.
347
+ if self._year >= 1997:
348
+ dt = date(self._year, OCT, 1)
349
+ if self._is_sunday(dt) or dt == mid_autumn_date or dt == dt_double_ninth:
350
+ # 國慶日翌日.
351
+ self._add_holiday("The day following National Day", self._get_next_workday(dt))
352
+ else:
353
+ # 國慶日.
354
+ self._add_holiday_oct_1("National Day")
355
+ if self._year in {1997, 1998}:
356
+ # 國慶日翌日.
357
+ self._add_holiday_oct_2("The day following National Day")
358
+
359
+ # Christmas Day.
360
+ # 聖誕節.
175
361
  name = "Christmas Day"
176
- first_after_christmas = f"The first weekday after {name}"
177
- second_after_christmas = f"The second weekday after {name}"
362
+ # 聖誕節後第一個周日.
363
+ first_after_christmas = "The first weekday after Christmas Day"
364
+ # 聖誕節後第二個周日.
365
+ second_after_christmas = "The second weekday after Christmas Day"
178
366
  dt_christmas = self._christmas_day
179
- if self.observed:
180
- if self._is_sunday(dt_christmas):
181
- self._add_christmas_day_two(first_after_christmas)
182
- self._add_christmas_day_three(second_after_christmas)
183
- elif self._is_saturday(dt_christmas):
184
- self._add_christmas_day(name)
185
- self._add_christmas_day_three(first_after_christmas)
186
- else:
187
- self._add_christmas_day(name)
188
- self._add_christmas_day_two(first_after_christmas)
367
+ if self._is_sunday(dt_christmas):
368
+ self._add_christmas_day_two(first_after_christmas)
369
+ self._add_christmas_day_three(second_after_christmas)
370
+ elif self._is_saturday(dt_christmas):
371
+ self._add_christmas_day(name)
372
+ self._add_christmas_day_three(first_after_christmas)
189
373
  else:
190
374
  self._add_christmas_day(name)
191
375
  self._add_christmas_day_two(first_after_christmas)
192
376
 
193
- # Previous holidays
194
- if 1952 <= self._year <= 1997:
195
- # Queen's Birthday (June 2nd Monday)
196
- self._add_holiday_2nd_mon_of_jun("Queen's Birthday")
377
+ # Previous holidays.
378
+
379
+ # Queen's Birthday.
380
+ # 英女皇壽辰.
381
+ if 1952 <= self._year <= 1996:
382
+ name = "Queen's Birthday"
383
+ if self._year >= 1983:
384
+ self._add_holiday_2nd_sat_of_jun(name)
385
+ self._add_holiday_2_days_past_2nd_sat_of_jun(name)
386
+ else:
387
+ if self._year != 1952:
388
+ self._add_holiday_apr_21(name)
389
+ else:
390
+ self._add_holiday_jun_5(name)
391
+
392
+ if self._year <= 1967:
393
+ # Monday after Pentecost.
394
+ # 靈降臨節後星期一.
395
+ self._add_whit_monday("Monday after Pentecost")
396
+
397
+ # National Day of the Republic of China.
398
+ # 中華民國國慶日.
399
+ self._add_holiday_2nd_mon_of_oct("National Day of the Republic of China")
400
+
401
+ # Monday after Peace Memorial Day.
402
+ # 和平紀念日後星期一.
403
+ self._add_holiday_1_day_past_2nd_sun_of_nov("Monday after Peace Memorial Day")
197
404
 
198
405
  if self._year <= 1996:
199
- # Anniversary of the liberation of Hong Kong (August last Monday)
200
- self._add_holiday_last_mon_of_aug("Anniversary of the liberation of Hong Kong")
201
-
202
- if self._year <= 1998:
203
- # Anniversary of the victory in the Second Sino-Japanese War
204
- super()._add_holiday(
205
- "Anniversary of the victory in the Second Sino-Japanese War",
206
- _get_nth_weekday_of_month(-1, MON, AUG, self._year) + td(days=-1),
207
- )
406
+ # Anniversary of the liberation of Hong Kong.
407
+ # 重光紀念日.
408
+ name = "Anniversary of the liberation of Hong Kong"
409
+ if self._year >= 1983:
410
+ self._add_holiday_last_mon_of_aug(name)
411
+ self._add_holiday_2_days_prior_last_mon_of_aug(name)
412
+ elif self._year >= 1968:
413
+ self._add_holiday_1st_mon_of_aug(name)
414
+ self._add_holiday_last_mon_of_aug(name)
415
+ else:
416
+ self._add_holiday_aug_30(name)
417
+
418
+ @property
419
+ def _winter_solstice_date(self) -> Tuple[int, int]:
420
+ # This approximation is reliable for 1952-2099 years.
421
+ if (
422
+ (self._year % 4 == 0 and self._year >= 1988)
423
+ or (self._year % 4 == 1 and self._year >= 2021)
424
+ or (self._year % 4 == 2 and self._year >= 2058)
425
+ or (self._year % 4 == 3 and self._year >= 2091)
426
+ ):
427
+ day = 21
428
+ else:
429
+ day = 22
430
+ return DEC, day
208
431
 
209
432
 
210
433
  class HK(HongKong):
@@ -216,14 +439,56 @@ class HKG(HongKong):
216
439
 
217
440
 
218
441
  class HongKongStaticHolidays:
442
+ # 英國王儲查理斯王子與戴安娜婚禮.
443
+ wedding_of_charles_and_diana = "Wedding of Prince Charles and Diana"
444
+
445
+ # 英女王伊利沙伯二世伉儷訪港的第二天.
446
+ queen_visit_hk = "Second day of Queen Elizabeth II and her husband's visit to Hong Kong"
447
+
448
+ # 英女皇壽辰.
449
+ queen_birthday = "Queen's Birthday"
450
+
451
+ # 香港特別行政區成立紀念日翌日.
452
+ day_following_hksar_establishment_day = (
453
+ "The day following Hong Kong Special Administrative Region Establishment Day"
454
+ )
455
+
456
+ # 中國人民抗日戰爭勝利70周年紀念日.
457
+ victory_70th_anniversary = (
458
+ "The 70th anniversary day of the victory of the Chinese "
459
+ "people's war of resistance against Japanese aggression"
460
+ )
461
+
462
+ # 抗日戰爭勝利紀念日.
463
+ war_victory_day = "Sino-Japanese War Victory Day"
464
+
465
+ # 國慶日翌日.
466
+ day_following_national_day = "The day following National Day"
467
+
468
+ # 額外公眾假期.
469
+ additional_public_holiday = "Additional public holiday"
470
+
219
471
  special_public_holidays = {
220
- 1997: (JUL, 2, "Hong Kong Special Administrative Region Establishment Day"),
221
- 2015: (
222
- (
223
- SEP,
224
- 3,
225
- "The 70th anniversary day of the victory of the Chinese "
226
- "people's war of resistance against Japanese aggression",
227
- )
472
+ 1981: (JUL, 29, wedding_of_charles_and_diana),
473
+ 1986: (OCT, 22, queen_visit_hk),
474
+ 1997: (JUL, 2, day_following_hksar_establishment_day),
475
+ 2015: (SEP, 3, victory_70th_anniversary),
476
+ }
477
+
478
+ special_optional_holidays = {
479
+ 1981: (JUL, 29, wedding_of_charles_and_diana),
480
+ 1986: (OCT, 22, queen_visit_hk),
481
+ 1997: (
482
+ (JUN, 28, queen_birthday),
483
+ (JUN, 30, queen_birthday),
484
+ (JUL, 2, day_following_hksar_establishment_day),
485
+ (AUG, 18, war_victory_day),
486
+ (OCT, 2, day_following_national_day),
487
+ ),
488
+ 1998: (
489
+ (AUG, 17, war_victory_day),
490
+ (OCT, 2, day_following_national_day),
228
491
  ),
492
+ 1999: (DEC, 31, additional_public_holiday),
493
+ 2015: (SEP, 3, victory_70th_anniversary),
229
494
  }