init with day of year
This commit is contained in:
parent
081a66c369
commit
683203e446
@ -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
|
||||||
|
@ -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)
|
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