Skip to content

Commit

Permalink
Fixed Japanese Vernal and Autumnal Equinox days (#116)
Browse files Browse the repository at this point in the history
* Fixed Japanese Equinox Day calculation

There was an algorithm to calculate Vernal and Autumnal Equinox Days for Japanese calendar. Although specific days for these holidays are announced every year by the government, it has never announced a different date.

* Fixed Japanese Vernal and Autumnal Equinox days

Fixed case when Vernal or Autumnal Equinox day falls on Sunday. In this case the next Monday becomes a holiday.

---------

Co-authored-by: Mazov Sergey <mazov@indexpro.co.jp>
  • Loading branch information
Makaopior and Mazov Sergey authored Mar 7, 2024
1 parent f17de33 commit 2decb8c
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 17 deletions.
36 changes: 24 additions & 12 deletions src/PublicHoliday/JapanPublicHoliday.cs
Original file line number Diff line number Diff line change
Expand Up @@ -58,26 +58,32 @@ public static DateTime VernalEquinoxDay(int year)

var yearModuloFour = year % 4;

DateTime vernalEquinoxDay;
if (year >= 1960 && year <= 1991)
{
return yearModuloFour == 0
vernalEquinoxDay = yearModuloFour == 0
? new DateTime(year, 3, 20)
: new DateTime(year, 3, 21);
}
if (year >= 1992 && year <= 2023)
else if (year >= 1992 && year <= 2023)
{
return yearModuloFour == 0 || yearModuloFour == 1
vernalEquinoxDay = yearModuloFour == 0 || yearModuloFour == 1
? new DateTime(year, 3, 20)
: new DateTime(year, 3, 21);
}
if (year >= 2024 && year <= 2055)
else if (year >= 2024 && year <= 2055)
{
return yearModuloFour == 3
vernalEquinoxDay = yearModuloFour == 3
? new DateTime(year, 3, 21)
: new DateTime(year, 3, 20);
}
else
{
// May be not precise
vernalEquinoxDay = new DateTime(year, 3, 20);
}

return FixSunday(new DateTime(year, 3, 20));
return FixSunday(vernalEquinoxDay);
}

/// <summary>
Expand Down Expand Up @@ -169,24 +175,30 @@ public static DateTime AutumnalEquinoxDay(int year)

var yearModuloFour = year % 4;

DateTime autumnalEquinoxDay;
if (year >= 1980 && year <= 2011)
{
return new DateTime(year, 9, 23);
autumnalEquinoxDay = new DateTime(year, 9, 23);
}
if (year >= 2012 && year <= 2043)
else if (year >= 2012 && year <= 2043)
{
return yearModuloFour == 0
autumnalEquinoxDay = yearModuloFour == 0
? new DateTime(year, 9, 22)
: new DateTime(year, 9, 23);
}
if (year >= 2044 && year <= 2075)
else if (year >= 2044 && year <= 2075)
{
return yearModuloFour == 0 || yearModuloFour == 1
autumnalEquinoxDay = yearModuloFour == 0 || yearModuloFour == 1
? new DateTime(year, 9, 22)
: new DateTime(year, 9, 23);
}
else
{
// May be not precise
autumnalEquinoxDay = new DateTime(year, 9, 23);
}

return FixSunday(new DateTime(year, 9, 23));
return FixSunday(autumnalEquinoxDay);
}

/// <summary>
Expand Down
10 changes: 5 additions & 5 deletions tests/PublicHolidayTests/TestJapanPublicHoliday.cs
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ public void TestVernalEquinoxDay()
{
Assert.AreEqual(new DateTime(1980, 3, 20), JapanPublicHoliday.VernalEquinoxDay(1980));
Assert.AreEqual(new DateTime(1981, 3, 21), JapanPublicHoliday.VernalEquinoxDay(1981));
Assert.AreEqual(new DateTime(1982, 3, 21), JapanPublicHoliday.VernalEquinoxDay(1982));
Assert.AreEqual(new DateTime(1982, 3, 22), JapanPublicHoliday.VernalEquinoxDay(1982));
Assert.AreEqual(new DateTime(1983, 3, 21), JapanPublicHoliday.VernalEquinoxDay(1983));

Assert.AreEqual(new DateTime(2000, 3, 20), JapanPublicHoliday.VernalEquinoxDay(2000));
Expand All @@ -53,7 +53,7 @@ public void TestVernalEquinoxDay()
Assert.AreEqual(new DateTime(2024, 3, 20), JapanPublicHoliday.VernalEquinoxDay(2024));
Assert.AreEqual(new DateTime(2025, 3, 20), JapanPublicHoliday.VernalEquinoxDay(2025));
Assert.AreEqual(new DateTime(2026, 3, 20), JapanPublicHoliday.VernalEquinoxDay(2026));
Assert.AreEqual(new DateTime(2027, 3, 21), JapanPublicHoliday.VernalEquinoxDay(2027));
Assert.AreEqual(new DateTime(2027, 3, 22), JapanPublicHoliday.VernalEquinoxDay(2027));
}

[TestMethod]
Expand All @@ -65,7 +65,7 @@ public void TestAutumnalEquinoxDay()
Assert.AreEqual(new DateTime(1983, 9, 23), JapanPublicHoliday.AutumnalEquinoxDay(1983));

Assert.AreEqual(new DateTime(2000, 9, 23), JapanPublicHoliday.AutumnalEquinoxDay(2000));
Assert.AreEqual(new DateTime(2001, 9, 23), JapanPublicHoliday.AutumnalEquinoxDay(2001));
Assert.AreEqual(new DateTime(2001, 9, 24), JapanPublicHoliday.AutumnalEquinoxDay(2001));
Assert.AreEqual(new DateTime(2002, 9, 23), JapanPublicHoliday.AutumnalEquinoxDay(2002));
Assert.AreEqual(new DateTime(2003, 9, 23), JapanPublicHoliday.AutumnalEquinoxDay(2003));

Expand All @@ -74,14 +74,14 @@ public void TestAutumnalEquinoxDay()
Assert.AreEqual(new DateTime(2022, 9, 23), JapanPublicHoliday.AutumnalEquinoxDay(2022));
Assert.AreEqual(new DateTime(2023, 9, 23), JapanPublicHoliday.AutumnalEquinoxDay(2023));

Assert.AreEqual(new DateTime(2024, 9, 22), JapanPublicHoliday.AutumnalEquinoxDay(2024));
Assert.AreEqual(new DateTime(2024, 9, 23), JapanPublicHoliday.AutumnalEquinoxDay(2024));
Assert.AreEqual(new DateTime(2025, 9, 23), JapanPublicHoliday.AutumnalEquinoxDay(2025));
Assert.AreEqual(new DateTime(2026, 9, 23), JapanPublicHoliday.AutumnalEquinoxDay(2026));
Assert.AreEqual(new DateTime(2027, 9, 23), JapanPublicHoliday.AutumnalEquinoxDay(2027));

Assert.AreEqual(new DateTime(2044, 9, 22), JapanPublicHoliday.AutumnalEquinoxDay(2044));
Assert.AreEqual(new DateTime(2045, 9, 22), JapanPublicHoliday.AutumnalEquinoxDay(2045));
Assert.AreEqual(new DateTime(2046, 9, 23), JapanPublicHoliday.AutumnalEquinoxDay(2046));
Assert.AreEqual(new DateTime(2046, 9, 24), JapanPublicHoliday.AutumnalEquinoxDay(2046));
Assert.AreEqual(new DateTime(2047, 9, 23), JapanPublicHoliday.AutumnalEquinoxDay(2047));
}

Expand Down

0 comments on commit 2decb8c

Please sign in to comment.