fixed definition of year day to match official
This commit is contained in:
parent
b7404f7741
commit
cdff0fd7bb
12
README.md
12
README.md
@ -72,12 +72,12 @@ jan_first < fixed_date # False
|
|||||||
Year day is the day after the last of December and before the first of January.
|
Year day is the day after the last of December and before the first of January.
|
||||||
For that date, `FixedDate` gives the following property values.
|
For that date, `FixedDate` gives the following property values.
|
||||||
|
|
||||||
* `day_of_year` = 365
|
* `day_of_year` = 365 (366 on leap years)
|
||||||
* `day_of_month` = 1
|
* `day_of_month` = 29
|
||||||
* `month` = 14
|
* `month` = 13
|
||||||
* `year` is obviously the ending year
|
* `year` is obviously the ending year
|
||||||
* `is_year_day` = True
|
* `is_year_day` = True
|
||||||
* `week_of_month` = 1
|
* `week_of_month` = 4
|
||||||
* `weekday` = 1
|
* `weekday` = None
|
||||||
* `week_of_year` = 53
|
* `week_of_year` = 52
|
||||||
* `year_quarter` = 4
|
* `year_quarter` = 4
|
||||||
|
@ -77,7 +77,7 @@ class FixedDate:
|
|||||||
@property
|
@property
|
||||||
def day_of_month(self):
|
def day_of_month(self):
|
||||||
"""In range 1...29"""
|
"""In range 1...29"""
|
||||||
if self.is_leap_day:
|
if self.is_leap_day or self.is_year_day:
|
||||||
return 29
|
return 29
|
||||||
if self.is_leap_year and self.day_of_year > 169: # leap day past this year
|
if self.is_leap_year and self.day_of_year > 169: # leap day past this year
|
||||||
return ((self._day_of_year-2) % 28) + 1
|
return ((self._day_of_year-2) % 28) + 1
|
||||||
@ -88,6 +88,8 @@ class FixedDate:
|
|||||||
"""In range 1...13"""
|
"""In range 1...13"""
|
||||||
if self.is_leap_day:
|
if self.is_leap_day:
|
||||||
return 6
|
return 6
|
||||||
|
if self.is_year_day:
|
||||||
|
return 13
|
||||||
return ((self._day_of_year-1) // 28) + 1
|
return ((self._day_of_year-1) // 28) + 1
|
||||||
|
|
||||||
@property
|
@property
|
||||||
@ -98,19 +100,17 @@ class FixedDate:
|
|||||||
@property
|
@property
|
||||||
def is_year_day(self) -> bool:
|
def is_year_day(self) -> bool:
|
||||||
if self.is_leap_year:
|
if self.is_leap_year:
|
||||||
return self.day_of_year == 366
|
return self._day_of_year == 366
|
||||||
return self.day_of_year == 365
|
return self._day_of_year == 365
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def week_of_month(self) -> int:
|
def week_of_month(self) -> int:
|
||||||
"""The ordinal of the week in month. Value 1 for year day.
|
"""The ordinal of the week in month.
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
int: In range 1...4
|
int: In range 1...4
|
||||||
"""
|
"""
|
||||||
if self.is_year_day:
|
if self.is_leap_day or self.is_year_day:
|
||||||
return 1
|
|
||||||
if self.is_leap_day:
|
|
||||||
return 4
|
return 4
|
||||||
return ((self.day_of_month-1) // 7) + 1
|
return ((self.day_of_month-1) // 7) + 1
|
||||||
|
|
||||||
@ -119,26 +119,29 @@ class FixedDate:
|
|||||||
"""Ordinal of the day in week. Value 1 for year day.
|
"""Ordinal of the day in week. Value 1 for year day.
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
int: 1 for Sunday, 2 for Monday, 7 for Saturday
|
Optional[int]: 1 for Sunday, 2 for Monday, 7 for Saturday
|
||||||
|
None for leap day and year day.
|
||||||
"""
|
"""
|
||||||
if self.is_leap_day:
|
if self.is_leap_day or self.is_year_day:
|
||||||
return None
|
return None
|
||||||
return ((self.day_of_month-1) % 7) + 1
|
return ((self.day_of_month-1) % 7) + 1
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def week_of_year(self) -> int:
|
def week_of_year(self) -> int:
|
||||||
"""The ordinal of the week in year. Value 53 for year day.
|
"""The ordinal of the week in year.
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
int: In range 1...53
|
int: In range 1...52
|
||||||
"""
|
"""
|
||||||
if self.is_leap_day:
|
if self.is_leap_day:
|
||||||
return 24
|
return 24
|
||||||
|
if self.is_year_day:
|
||||||
|
return 52
|
||||||
return ((self._day_of_year-1) // 7) + 1
|
return ((self._day_of_year-1) // 7) + 1
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def year_quarter(self) -> int:
|
def year_quarter(self) -> int:
|
||||||
"""Quarter of the year. Value 4 for year day.
|
"""Quarter of the year.
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
int: In range 1...4
|
int: In range 1...4
|
||||||
|
@ -68,13 +68,13 @@ class TestBasicDatetimeInit(unittest.TestCase):
|
|||||||
fixed_date = FixedDate(date=datetime(2022, 12, 31))
|
fixed_date = FixedDate(date=datetime(2022, 12, 31))
|
||||||
self.assertEqual(fixed_date.datetime, datetime(2022, 12, 31))
|
self.assertEqual(fixed_date.datetime, datetime(2022, 12, 31))
|
||||||
self.assertEqual(fixed_date.year, 2022)
|
self.assertEqual(fixed_date.year, 2022)
|
||||||
self.assertEqual(fixed_date.month, 14)
|
self.assertEqual(fixed_date.month, 13)
|
||||||
self.assertEqual(fixed_date.day_of_month, 1)
|
self.assertEqual(fixed_date.day_of_month, 29)
|
||||||
self.assertTrue(fixed_date.is_year_day)
|
self.assertTrue(fixed_date.is_year_day)
|
||||||
self.assertEqual(fixed_date.day_of_year, 365)
|
self.assertEqual(fixed_date.day_of_year, 365)
|
||||||
self.assertEqual(fixed_date.week_of_month, 1)
|
self.assertEqual(fixed_date.week_of_month, 4)
|
||||||
self.assertEqual(fixed_date.weekday, 1)
|
self.assertIsNone(fixed_date.weekday)
|
||||||
self.assertEqual(fixed_date.week_of_year, 53)
|
self.assertEqual(fixed_date.week_of_year, 52)
|
||||||
self.assertEqual(fixed_date.year_quarter, 4)
|
self.assertEqual(fixed_date.year_quarter, 4)
|
||||||
|
|
||||||
def test_today(self):
|
def test_today(self):
|
||||||
|
@ -31,6 +31,6 @@ class TestBasicDayOfYearInit(unittest.TestCase):
|
|||||||
def test_day_of_year_init_year_day(self):
|
def test_day_of_year_init_year_day(self):
|
||||||
fixed_date = FixedDate(day_of_year=365, year=2022) # 2022-12-31 Gregorian
|
fixed_date = FixedDate(day_of_year=365, year=2022) # 2022-12-31 Gregorian
|
||||||
self.assertEqual(fixed_date.year, 2022)
|
self.assertEqual(fixed_date.year, 2022)
|
||||||
self.assertEqual(fixed_date.month, 14)
|
self.assertEqual(fixed_date.month, 13)
|
||||||
self.assertEqual(fixed_date.day_of_month, 1)
|
self.assertEqual(fixed_date.day_of_month, 29)
|
||||||
self.assertTrue(fixed_date.is_year_day)
|
self.assertTrue(fixed_date.is_year_day)
|
||||||
|
@ -38,8 +38,8 @@ class TestLeapYear(unittest.TestCase):
|
|||||||
fixed_date = FixedDate(day_of_year=366, year=2024)
|
fixed_date = FixedDate(day_of_year=366, year=2024)
|
||||||
self.assertTrue(fixed_date.is_year_day)
|
self.assertTrue(fixed_date.is_year_day)
|
||||||
self.assertEqual(fixed_date.year, 2024)
|
self.assertEqual(fixed_date.year, 2024)
|
||||||
self.assertEqual(fixed_date.month, 14)
|
self.assertEqual(fixed_date.month, 13)
|
||||||
self.assertEqual(fixed_date.day_of_month, 1)
|
self.assertEqual(fixed_date.day_of_month, 29)
|
||||||
|
|
||||||
def test_ordinary_date_after_leap_day(self):
|
def test_ordinary_date_after_leap_day(self):
|
||||||
fixed_date = FixedDate(datetime(2024, 10, 13))
|
fixed_date = FixedDate(datetime(2024, 10, 13))
|
||||||
|
@ -13,4 +13,4 @@ class TestStringRepresentation(unittest.TestCase):
|
|||||||
|
|
||||||
def test_string_of_year_day(self):
|
def test_string_of_year_day(self):
|
||||||
fixed_date = FixedDate(day_of_year=365, year=2022)
|
fixed_date = FixedDate(day_of_year=365, year=2022)
|
||||||
self.assertEqual(str(fixed_date), "2022-14-01")
|
self.assertEqual(str(fixed_date), "2022-13-29")
|
||||||
|
Loading…
x
Reference in New Issue
Block a user