init with day of year

This commit is contained in:
PyryL 2022-12-11 09:49:32 +02:00
parent 081a66c369
commit 683203e446
3 changed files with 65 additions and 17 deletions

View File

@ -1,37 +1,49 @@
from datetime import datetime from datetime import datetime
class FixedDate: class FixedDate:
def __init__(self, date = None): def __init__(self, date = None, day_of_year = None, year = None):
if date is not None: if date is not None:
self._from_datetime(date) init_tuple = self._from_datetime(date)
elif day_of_year is not None and year is not None:
init_tuple = self._from_day_of_year(day_of_year, year)
else: else:
raise ValueError("Invalid FixedDate initialization") raise ValueError("Invalid FixedDate initialization")
def _from_datetime(self, _datetime): self._day_of_year, self._year = init_tuple
day_of_year = _datetime.timetuple().tm_yday # 1...
self._from_day_of_year(day_of_year, _datetime.year)
def _from_day_of_year(self, day_of_year: int, year: int) -> None: def _from_datetime(self, _datetime: datetime) -> tuple:
"""Initialize this class with native datetime object.
Args:
_datetime (datetime): _description_
Returns:
tuple: day of year (1...366) and year (1...9999) in a tuple
"""
day_of_year = _datetime.timetuple().tm_yday
return self._from_day_of_year(day_of_year, _datetime.year)
def _from_day_of_year(self, day_of_year: int, year: int) -> tuple:
"""Initialize this class with day of year and year. """Initialize this class with day of year and year.
Args: Args:
day_of_year (int): In range 1...366 day_of_year (int): In range 1...366
year (int): In range 1...9999 year (int): In range 1...9999
Returns:
tuple: day of year (1...366) and year (1...9999) in a tuple
""" """
self._month, self._day_of_month = divmod(day_of_year-1, 28) return (day_of_year, year)
self._month += 1
self._day_of_month += 1
self._year = year
@property @property
def day_of_month(self): def day_of_month(self):
"""In range 1...29""" """In range 1...29"""
return self._day_of_month return ((self._day_of_year-1) % 28) + 1
@property @property
def month(self): def month(self):
"""In range 1...13""" """In range 1...13"""
return self._month return ((self._day_of_year-1) // 28) + 1
@property @property
def year(self): def year(self):
@ -40,9 +52,12 @@ class FixedDate:
@property @property
def is_year_day(self) -> bool: def is_year_day(self) -> bool:
return self._month == 14 and self._day_of_month == 1 return self.month == 14 and self.day_of_month == 1
# TODO: week of month # TODO: week of month
# TODO: week of year # TODO: week of year
# TODO: weekday # TODO: weekday
# TODO: year quarter # TODO: year quarter
# TODO: datetime instance
# TODO: plus and minus operations
# TODO: equatable

View File

@ -2,10 +2,7 @@ import unittest
from datetime import datetime from datetime import datetime
from fixedcal.core.date import FixedDate from fixedcal.core.date import FixedDate
class TestDate(unittest.TestCase): class TestBasicDatetimeInit(unittest.TestCase):
def setUp(self):
pass
def test_datetime_init_january_first(self): def test_datetime_init_january_first(self):
fixed_date = FixedDate(date=datetime(2022, 1, 1)) fixed_date = FixedDate(date=datetime(2022, 1, 1))
self.assertEqual(fixed_date.year, 2022) self.assertEqual(fixed_date.year, 2022)

View File

@ -0,0 +1,36 @@
import unittest
from datetime import datetime
from fixedcal.core.date import FixedDate
class TestBasicDayOfYearInit(unittest.TestCase):
def test_day_of_year_init_january_first(self):
fixed_date = FixedDate(day_of_year=1, year=2022)
self.assertEqual(fixed_date.year, 2022)
self.assertEqual(fixed_date.month, 1)
self.assertEqual(fixed_date.day_of_month, 1)
def test_day_of_year_init_february_last(self):
fixed_date = FixedDate(day_of_year=56, year=2022) # 2022-02-25 Gregorian
self.assertEqual(fixed_date.year, 2022)
self.assertEqual(fixed_date.month, 2)
self.assertEqual(fixed_date.day_of_month, 28)
def test_day_of_year_init_sol_month(self):
fixed_date = FixedDate(day_of_year=171, year=2022) # 2022-06-20 Gregorian
self.assertEqual(fixed_date.year, 2022)
self.assertEqual(fixed_date.month, 7)
self.assertEqual(fixed_date.day_of_month, 3)
def test_day_of_year_init_december_last(self):
fixed_date = FixedDate(day_of_year=364, year=2022) # 2022-12-30 Gregorian
self.assertEqual(fixed_date.year, 2022)
self.assertEqual(fixed_date.month, 13)
self.assertEqual(fixed_date.day_of_month, 28)
self.assertFalse(fixed_date.is_year_day)
def test_day_of_year_init_year_day(self):
fixed_date = FixedDate(day_of_year=365, year=2022) # 2022-12-31 Gregorian
self.assertEqual(fixed_date.year, 2022)
self.assertEqual(fixed_date.month, 14)
self.assertEqual(fixed_date.day_of_month, 1)
self.assertTrue(fixed_date.is_year_day)