100 lines
3.8 KiB
Python
100 lines
3.8 KiB
Python
from datetime import date
|
|
|
|
from ..core import NewYearsDayMixin, Calendar, MON, SAT, SUN
|
|
from ..astronomy import calculate_equinoxes
|
|
from ..registry_tools import iso_register
|
|
|
|
|
|
@iso_register('JP')
|
|
class Japan(NewYearsDayMixin, Calendar):
|
|
"Japan"
|
|
|
|
# Japan uses the "western" workweek
|
|
WEEKEND_DAYS = (SAT, SUN)
|
|
|
|
FIXED_HOLIDAYS = NewYearsDayMixin.FIXED_HOLIDAYS + (
|
|
(2, 11, "Foundation Day"),
|
|
(4, 29, "Showa Day"),
|
|
(5, 3, "Constitution Memorial Day"),
|
|
(5, 4, "Greenery Day"),
|
|
(5, 5, "Children's Day"),
|
|
(11, 3, "Culture Day"),
|
|
(11, 23, "Labour Thanksgiving Day"),
|
|
)
|
|
|
|
def get_fixed_holidays(self, year):
|
|
"""
|
|
Fixed holidays for Japan.
|
|
"""
|
|
days = super().get_fixed_holidays(year)
|
|
if year >= 2016:
|
|
days.append((date(year, 8, 11), "Mountain Day"))
|
|
# Change in Emperor
|
|
if year < 2019:
|
|
days.append((date(year, 12, 23), "The Emperor's Birthday"))
|
|
if year > 2019:
|
|
days.append((date(year, 2, 23), "The Emperor's Birthday"))
|
|
# Lots of adjustments for new emperor
|
|
if year == 2019:
|
|
days.extend([
|
|
(date(year, 4, 30), "Coronation Day"),
|
|
(date(year, 5, 1), "Coronation Day"),
|
|
(date(year, 5, 2), "Coronation Day"),
|
|
(date(year, 5, 6), "Children's Day Observed"),
|
|
(date(year, 8, 12), "Mountain Day Observed"),
|
|
(date(year, 10, 22), "Enthronement Ceremony Day"),
|
|
(date(year, 11, 4), "Culture Day Observed"),
|
|
])
|
|
if year == 2020:
|
|
days.extend([
|
|
(date(year, 2, 24), "The Emperor's Birthday Observed"),
|
|
(date(year, 5, 6), "Constitution Memorial Day Observed"),
|
|
(date(year, 8, 10), "Mountain Day"),
|
|
])
|
|
# Mountain Day is 8/10 this year for some reason
|
|
# The next year that will be different is 2024
|
|
days.remove((date(year, 8, 11), "Mountain Day"))
|
|
return days
|
|
|
|
def get_variable_days(self, year):
|
|
# usual variable days
|
|
days = super().get_variable_days(year)
|
|
equinoxes = calculate_equinoxes(year, 'Asia/Tokyo')
|
|
coming_of_age_day = Japan.get_nth_weekday_in_month(year, 1, MON, 2)
|
|
marine_day = Japan.get_nth_weekday_in_month(year, 7, MON, 3)
|
|
respect_for_the_aged = Japan.get_nth_weekday_in_month(year, 9, MON, 3)
|
|
health_and_sport = Japan.get_nth_weekday_in_month(year, 10, MON, 2)
|
|
days.extend([
|
|
(coming_of_age_day, 'Coming of Age Day'),
|
|
(marine_day, "Marine Day"),
|
|
(equinoxes[0], "Vernal Equinox Day"),
|
|
(respect_for_the_aged, "Respect-for-the-Aged Day"),
|
|
(equinoxes[1], "Autumnal Equinox Day"),
|
|
(health_and_sport, "Health and Sports Day"),
|
|
])
|
|
|
|
# Marine Day is on a Thursday in 2020 for some year
|
|
# https://www.timeanddate.com/holidays/japan/sea-day
|
|
# Health and Sports Day will continue on the 2nd monday
|
|
# of October, except in 2020 when it will happen in July
|
|
# https://www.timeanddate.com/holidays/japan/sports-day
|
|
if year == 2020:
|
|
days.remove((marine_day, "Marine Day"))
|
|
days.append((date(2020, 7, 23), "Marine Day"))
|
|
days.remove((health_and_sport, "Health and Sports Day"))
|
|
days.append((date(2020, 7, 24), "Health and Sports Day"))
|
|
return days
|
|
|
|
|
|
class JapanBank(Japan):
|
|
"""The Bank of Japan is closed additional days other than
|
|
national holidays.
|
|
https://www.boj.or.jp/en/about/outline/holi.htm/
|
|
"""
|
|
|
|
FIXED_HOLIDAYS = Japan.FIXED_HOLIDAYS + (
|
|
(1, 2, "New Year Bank Holiday"),
|
|
(1, 3, "New Year Bank Holiday"),
|
|
(12, 31, "New Year Bank Holiday"),
|
|
)
|