From 2decb8c799c4d604a05f0e568404bc6930f5f661 Mon Sep 17 00:00:00 2001 From: Makaopior <152356597+Makaopior@users.noreply.github.com> Date: Fri, 8 Mar 2024 03:09:57 +0900 Subject: [PATCH] Fixed Japanese Vernal and Autumnal Equinox days (#116) * 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 --- src/PublicHoliday/JapanPublicHoliday.cs | 36 ++++++++++++------- .../TestJapanPublicHoliday.cs | 10 +++--- 2 files changed, 29 insertions(+), 17 deletions(-) diff --git a/src/PublicHoliday/JapanPublicHoliday.cs b/src/PublicHoliday/JapanPublicHoliday.cs index 21b03b1..33f3625 100644 --- a/src/PublicHoliday/JapanPublicHoliday.cs +++ b/src/PublicHoliday/JapanPublicHoliday.cs @@ -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); } /// @@ -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); } /// diff --git a/tests/PublicHolidayTests/TestJapanPublicHoliday.cs b/tests/PublicHolidayTests/TestJapanPublicHoliday.cs index 83b8dec..23c55dc 100644 --- a/tests/PublicHolidayTests/TestJapanPublicHoliday.cs +++ b/tests/PublicHolidayTests/TestJapanPublicHoliday.cs @@ -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)); @@ -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] @@ -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)); @@ -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)); }