Skip to content

Commit

Permalink
Fix leap year calculation in to_jalali function
Browse files Browse the repository at this point in the history
  • Loading branch information
majiidd committed Jun 22, 2024
1 parent 7226d2e commit 672a26c
Show file tree
Hide file tree
Showing 4 changed files with 60 additions and 11 deletions.
2 changes: 1 addition & 1 deletion persiantools/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

__title__ = "persiantools"
__url__ = "https://github.com/majiidd/persiantools"
__version__ = "4.0.2"
__version__ = "4.0.3"
__build__ = __version__
__author__ = "Majid Hajiloo"
__author_email__ = "majid.hajiloo@gmail.com"
Expand Down
3 changes: 2 additions & 1 deletion persiantools/jdatetime.py
Original file line number Diff line number Diff line change
Expand Up @@ -247,9 +247,10 @@ def to_jalali(cls, year, month=None, day=None):
days %= 12053
jalali_year += 4 * (days // 1461)
days %= 1461
jalali_year += (days - 1) // 365

# Correct for the leap year case
if days > 365:
jalali_year += (days - 1) // 365
days = (days - 1) % 365

# Determine the Jalali month and day
Expand Down
62 changes: 53 additions & 9 deletions tests/test_jalalidate.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,21 +14,39 @@ def test_shamsi_to_gregorian(self):
self.assertEqual(JalaliDate(1367, 2, 14).to_gregorian(), date(1988, 5, 4))
self.assertEqual(JalaliDate(1395, 3, 21).to_gregorian(), date(2016, 6, 10))
self.assertEqual(JalaliDate(1395, 12, 9).to_gregorian(), date(2017, 2, 27))
self.assertEqual(JalaliDate(1395, 12, 30).to_gregorian(), date(2017, 3, 20))
self.assertEqual(JalaliDate(1396, 1, 1).to_gregorian(), date(2017, 3, 21))
self.assertEqual(JalaliDate(1400, 6, 31).to_gregorian(), date(2021, 9, 22))
self.assertEqual(JalaliDate(1396, 7, 27).to_gregorian(), date(2017, 10, 19))
self.assertEqual(JalaliDate(1397, 11, 29).to_gregorian(), date(2019, 2, 18))
self.assertEqual(JalaliDate(1399, 11, 23).to_gregorian(), date(2021, 2, 11))
self.assertEqual(JalaliDate(1400, 4, 25).to_gregorian(), date(2021, 7, 16))
self.assertEqual(JalaliDate(1400, 12, 20).to_gregorian(), date(2022, 3, 11))
self.assertEqual(JalaliDate(1403, 1, 5).to_gregorian(), date(2024, 3, 24))
self.assertEqual(JalaliDate(1390, 10, 11).to_gregorian(), date(2012, 1, 1))
self.assertEqual(JalaliDate(1398, 10, 11).to_gregorian(), date(2020, 1, 1))
self.assertEqual(JalaliDate(1402, 10, 11).to_gregorian(), date(2024, 1, 1))
self.assertEqual(JalaliDate(1402, 10, 10).to_gregorian(), date(2023, 12, 31))
self.assertEqual(JalaliDate(1403, 10, 11).to_gregorian(), date(2024, 12, 31))
self.assertEqual(JalaliDate(1403, 2, 23).to_gregorian(), date(2024, 5, 12))
self.assertEqual(JalaliDate(1403, 4, 3).to_gregorian(), date(2024, 6, 23))

self.assertEqual(JalaliDate(1391, 12, 30).to_gregorian(), date(2013, 3, 20))
self.assertEqual(JalaliDate(1395, 12, 30).to_gregorian(), date(2017, 3, 20))
self.assertEqual(JalaliDate(1399, 12, 30).to_gregorian(), date(2021, 3, 20))
self.assertEqual(JalaliDate(1403, 12, 30).to_gregorian(), date(2025, 3, 20))

self.assertEqual(JalaliDate(1378, 10, 11).to_gregorian(), date(2000, 1, 1))
self.assertEqual(JalaliDate(1379, 10, 12).to_gregorian(), date(2001, 1, 1))
self.assertEqual(JalaliDate(1390, 10, 11).to_gregorian(), date(2012, 1, 1))
self.assertEqual(JalaliDate(1393, 10, 11).to_gregorian(), date(2015, 1, 1))
self.assertEqual(JalaliDate(1398, 10, 11).to_gregorian(), date(2020, 1, 1))
self.assertEqual(JalaliDate(1399, 10, 12).to_gregorian(), date(2021, 1, 1))
self.assertEqual(JalaliDate(1402, 10, 11).to_gregorian(), date(2024, 1, 1))
self.assertEqual(JalaliDate(1403, 10, 12).to_gregorian(), date(2025, 1, 1))

self.assertEqual(JalaliDate(1367, 1, 1).to_gregorian(), date(1988, 3, 21))
self.assertEqual(JalaliDate(1396, 1, 1).to_gregorian(), date(2017, 3, 21))
self.assertEqual(JalaliDate(1399, 1, 1).to_gregorian(), date(2020, 3, 20))
self.assertEqual(JalaliDate(1400, 1, 1).to_gregorian(), date(2021, 3, 21))
self.assertEqual(JalaliDate(1402, 1, 1).to_gregorian(), date(2023, 3, 21))
self.assertEqual(JalaliDate(1403, 1, 1).to_gregorian(), date(2024, 3, 20))
self.assertEqual(JalaliDate(1404, 1, 1).to_gregorian(), date(2025, 3, 21))

self.assertEqual(JalaliDate.today().to_gregorian(), date.today())

Expand All @@ -39,20 +57,40 @@ def test_gregorian_to_shamsi(self):
self.assertEqual(JalaliDate(date(2000, 1, 1)), JalaliDate(1378, 10, 11))
self.assertEqual(JalaliDate(date(2017, 10, 19)), JalaliDate(1396, 7, 27))
self.assertEqual(JalaliDate(date(2019, 2, 18)), JalaliDate(1397, 11, 29))
self.assertEqual(JalaliDate(date(2020, 3, 20)), JalaliDate(1399, 1, 1))
self.assertEqual(JalaliDate(date(2021, 3, 21)), JalaliDate(1400, 1, 1))
self.assertEqual(JalaliDate(date(2023, 3, 21)), JalaliDate(1402, 1, 1))
self.assertEqual(JalaliDate(date(2025, 1, 1)), JalaliDate(1403, 10, 12))

self.assertEqual(JalaliDate.to_jalali(1990, 9, 23), JalaliDate(1369, 7, 1))
self.assertEqual(JalaliDate.to_jalali(1990, 9, 23), JalaliDate(1369, 7, 1))
self.assertEqual(JalaliDate.to_jalali(2013, 9, 16), JalaliDate(1392, 6, 25))
self.assertEqual(JalaliDate.to_jalali(2018, 3, 20), JalaliDate(1396, 12, 29))
self.assertEqual(JalaliDate.to_jalali(2021, 2, 11), JalaliDate(1399, 11, 23))
self.assertEqual(JalaliDate.to_jalali(2021, 7, 16), JalaliDate(1400, 4, 25))
self.assertEqual(JalaliDate.to_jalali(2024, 3, 24), JalaliDate(1403, 1, 5))
self.assertEqual(JalaliDate.to_jalali(2012, 1, 1), JalaliDate(1390, 10, 11))
self.assertEqual(JalaliDate.to_jalali(2020, 1, 1), JalaliDate(1398, 10, 11))
self.assertEqual(JalaliDate.to_jalali(2024, 1, 1), JalaliDate(1402, 10, 11))
self.assertEqual(JalaliDate.to_jalali(2024, 1, 1), JalaliDate(1402, 10, 11))
self.assertEqual(JalaliDate.to_jalali(2020, 3, 19), JalaliDate(1398, 12, 29))
self.assertEqual(JalaliDate.to_jalali(2023, 12, 31), JalaliDate(1402, 10, 10))
self.assertEqual(JalaliDate.to_jalali(2024, 12, 31), JalaliDate(1403, 10, 11))
self.assertEqual(JalaliDate.to_jalali(2024, 5, 12), JalaliDate(1403, 2, 23))
self.assertEqual(JalaliDate.to_jalali(2024, 6, 23), JalaliDate(1403, 4, 3))

self.assertEqual(JalaliDate.to_jalali(2021, 3, 20), JalaliDate(1399, 12, 30))
self.assertEqual(JalaliDate.to_jalali(2025, 3, 20), JalaliDate(1403, 12, 30))

self.assertEqual(JalaliDate.to_jalali(2000, 1, 1), JalaliDate(1378, 10, 11))
self.assertEqual(JalaliDate.to_jalali(2012, 1, 1), JalaliDate(1390, 10, 11))
self.assertEqual(JalaliDate.to_jalali(2013, 1, 1), JalaliDate(1391, 10, 12))
self.assertEqual(JalaliDate.to_jalali(2020, 1, 1), JalaliDate(1398, 10, 11))
self.assertEqual(JalaliDate.to_jalali(2024, 1, 1), JalaliDate(1402, 10, 11))
self.assertEqual(JalaliDate.to_jalali(2025, 1, 1), JalaliDate(1403, 10, 12))

self.assertEqual(JalaliDate.to_jalali(1988, 3, 21), JalaliDate(1367, 1, 1))
self.assertEqual(JalaliDate.to_jalali(2019, 3, 21), JalaliDate(1398, 1, 1))
self.assertEqual(JalaliDate.to_jalali(2020, 3, 20), JalaliDate(1399, 1, 1))
self.assertEqual(JalaliDate.to_jalali(2021, 3, 21), JalaliDate(1400, 1, 1))
self.assertEqual(JalaliDate.to_jalali(2024, 3, 20), JalaliDate(1403, 1, 1))
self.assertEqual(JalaliDate.to_jalali(2025, 3, 21), JalaliDate(1404, 1, 1))

self.assertEqual(JalaliDate(date.today()), JalaliDate.today())

Expand All @@ -71,6 +109,7 @@ def test_checkdate(self):
self.assertEqual(JalaliDate.check_date(1399, 11, 31), False)
self.assertEqual(JalaliDate.check_date(1400, 4, 25), True)
self.assertEqual(JalaliDate.check_date(1400, 12, 30), False)
self.assertEqual(JalaliDate.check_date(1403, 4, 3), True)
self.assertEqual(JalaliDate.check_date(1403, 12, 30), True)

def test_completeday(self):
Expand Down Expand Up @@ -241,6 +280,7 @@ def test_week(self):
self.assertEqual(JalaliDate(1397, 11, 29).week_of_year(), 49)
self.assertEqual(JalaliDate(1399, 1, 2).week_of_year(), 2)
self.assertEqual(JalaliDate(1403, 1, 5).week_of_year(), 2)
self.assertEqual(JalaliDate(1403, 4, 3).week_of_year(), 15)

self.assertEqual(JalaliDate(1367, 2, 14).weekday(), 4)
self.assertEqual(JalaliDate(1393, 1, 1).weekday(), 6)
Expand All @@ -253,6 +293,7 @@ def test_week(self):
self.assertEqual(JalaliDate(1397, 1, 1).weekday(), 4)
self.assertEqual(JalaliDate(1397, 11, 29).weekday(), 2)
self.assertEqual(JalaliDate(1400, 1, 1).weekday(), 1)
self.assertEqual(JalaliDate(1403, 4, 3).isoweekday(), 2)
self.assertEqual(JalaliDate(1400, 1, 1).isoweekday(), 2)
self.assertEqual(JalaliDate(1396, 7, 27).isoweekday(), 6)
self.assertEqual(JalaliDate(1397, 11, 29).isoweekday(), 3)
Expand All @@ -273,6 +314,8 @@ def test_operators(self):
self.assertTrue(JalaliDate(1367, 2, 14) <= date(1988, 5, 4))
self.assertFalse(JalaliDate(1367, 2, 14) >= JalaliDate(1369, 1, 1))
self.assertTrue(JalaliDate(1397, 11, 29) >= JalaliDate(1397, 11, 10))
self.assertTrue(JalaliDate(1403, 12, 30) > JalaliDate(1403, 12, 29))
self.assertTrue(JalaliDate(1404, 1, 1) > JalaliDate(1403, 12, 30))

self.assertEqual(JalaliDate(1395, 3, 21) + timedelta(days=2), JalaliDate(1395, 3, 23))
self.assertEqual(JalaliDate(1396, 7, 27) + timedelta(days=4), JalaliDate(1396, 8, 1))
Expand All @@ -284,6 +327,7 @@ def test_operators(self):
self.assertEqual(JalaliDate(1395, 3, 21) - date(2016, 5, 3), timedelta(days=38))
self.assertEqual(JalaliDate(1395, 12, 30) - JalaliDate(1395, 1, 1), timedelta(days=365))
self.assertEqual(JalaliDate(1403, 1, 1) - JalaliDate(1402, 12, 29), timedelta(days=1))
self.assertEqual(JalaliDate(1404, 1, 1) - JalaliDate(1403, 12, 29), timedelta(days=2))

self.assertFalse(JalaliDate(1367, 2, 14) == (1367, 2, 14))
self.assertFalse(JalaliDate(1367, 2, 14) == "")
Expand Down
4 changes: 4 additions & 0 deletions tests/test_jalalidatetime.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,10 @@ def test_shamsi_to_gregorian(self):
JalaliDateTime(1399, 11, 23, 13, 12, 0, 0).to_gregorian(),
datetime(2021, 2, 11, 13, 12, 0, 0),
)
self.assertEqual(
JalaliDateTime(1404, 1, 1, 13, 12, 0, 0).to_gregorian(),
datetime(2025, 3, 21, 13, 12, 0, 0),
)

def test_gregorian_to_shamsi(self):
self.assertEqual(
Expand Down

0 comments on commit 672a26c

Please sign in to comment.