init with day of year
This commit is contained in:
parent
081a66c369
commit
683203e446
@ -1,37 +1,49 @@
|
||||
from datetime import datetime
|
||||
|
||||
class FixedDate:
|
||||
def __init__(self, date = None):
|
||||
def __init__(self, date = None, day_of_year = None, year = 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:
|
||||
raise ValueError("Invalid FixedDate initialization")
|
||||
|
||||
def _from_datetime(self, _datetime):
|
||||
day_of_year = _datetime.timetuple().tm_yday # 1...
|
||||
self._from_day_of_year(day_of_year, _datetime.year)
|
||||
self._day_of_year, self._year = init_tuple
|
||||
|
||||
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.
|
||||
|
||||
Args:
|
||||
day_of_year (int): In range 1...366
|
||||
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)
|
||||
self._month += 1
|
||||
self._day_of_month += 1
|
||||
self._year = year
|
||||
return (day_of_year, year)
|
||||
|
||||
@property
|
||||
def day_of_month(self):
|
||||
"""In range 1...29"""
|
||||
return self._day_of_month
|
||||
return ((self._day_of_year-1) % 28) + 1
|
||||
|
||||
@property
|
||||
def month(self):
|
||||
"""In range 1...13"""
|
||||
return self._month
|
||||
return ((self._day_of_year-1) // 28) + 1
|
||||
|
||||
@property
|
||||
def year(self):
|
||||
@ -40,9 +52,12 @@ class FixedDate:
|
||||
|
||||
@property
|
||||
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 year
|
||||
# TODO: weekday
|
||||
# TODO: year quarter
|
||||
# TODO: datetime instance
|
||||
# TODO: plus and minus operations
|
||||
# TODO: equatable
|
||||
|
@ -2,10 +2,7 @@ import unittest
|
||||
from datetime import datetime
|
||||
from fixedcal.core.date import FixedDate
|
||||
|
||||
class TestDate(unittest.TestCase):
|
||||
def setUp(self):
|
||||
pass
|
||||
|
||||
class TestBasicDatetimeInit(unittest.TestCase):
|
||||
def test_datetime_init_january_first(self):
|
||||
fixed_date = FixedDate(date=datetime(2022, 1, 1))
|
||||
self.assertEqual(fixed_date.year, 2022)
|
36
tests/basic_day_of_year_test.py
Normal file
36
tests/basic_day_of_year_test.py
Normal 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)
|
Loading…
x
Reference in New Issue
Block a user