diff --git a/python/datetime.py b/python/datetime.py index 8d8dc1de..9328e8a1 100644 --- a/python/datetime.py +++ b/python/datetime.py @@ -1,7 +1,41 @@ from time import localtime +class timedelta: + def __init__(self, days=0, seconds=0): + self.days = days + self.seconds = seconds + + def __repr__(self): + return f"datetime.timedelta(days={self.days}, seconds={self.seconds})" + + def __eq__(self, other: 'timedelta') -> bool: + if type(other) is not timedelta: + return NotImplemented + return (self.days, self.seconds) == (other.days, other.seconds) + + def __lt__(self, other: 'timedelta') -> bool: + if type(other) is not timedelta: + return NotImplemented + return (self.days, self.seconds) < (other.days, other.seconds) + + def __le__(self, other: 'timedelta') -> bool: + if type(other) is not timedelta: + return NotImplemented + return (self.days, self.seconds) <= (other.days, other.seconds) + + def __gt__(self, other: 'timedelta') -> bool: + if type(other) is not timedelta: + return NotImplemented + return (self.days, self.seconds) > (other.days, other.seconds) + + def __ge__(self, other: 'timedelta') -> bool: + if type(other) is not timedelta: + return NotImplemented + return (self.days, self.seconds) >= (other.days, other.seconds) + + class date: - def __init__(self, year: int, month: int, day: int): + def __init__(self, year: int, month: int = None, day: int = None): self.year = year self.month = month self.day = day @@ -10,18 +44,51 @@ class date: def today(): t = localtime() return date(t.tm_year, t.tm_mon, t.tm_mday) - + + def __eq__(self, other: 'date') -> bool: + if type(other) is not date: + return NotImplemented + return (self.year, self.month, self.day) == (other.year, other.month, other.day) + + def __lt__(self, other: 'date') -> bool: + if type(other) is not date: + return NotImplemented + return (self.year, self.month, self.day) < (other.year, other.month, other.day) + + def __le__(self, other: 'date') -> bool: + if type(other) is not date: + return NotImplemented + return (self.year, self.month, self.day) <= (other.year, other.month, other.day) + + def __gt__(self, other: 'date') -> bool: + if type(other) is not date: + return NotImplemented + return (self.year, self.month, self.day) > (other.year, other.month, other.day) + + def __ge__(self, other: 'date') -> bool: + if type(other) is not date: + return NotImplemented + return (self.year, self.month, self.day) >= (other.year, other.month, other.day) + def __str__(self): return f"{self.year}-{self.month:02}-{self.day:02}" - + def __repr__(self): return f"datetime.date({self.year}, {self.month}, {self.day})" + class datetime(date): - def __init__(self, year: int, month: int, day: int, hour: int, minute: int, second: int): - super(datetime, self).__init__(year, month, day) + def __init__(self, year: int, month: int = None, day: int = None, hour: int = None, minute: int = None, second: int = None): + super().__init__(year, month, day) + # Validate and set hour, minute, and second + if hour is not None and not 0 <= hour <= 23: + raise ValueError("Hour must be between 0 and 23") self.hour = hour + if minute is not None and not 0 <= minute <= 59: + raise ValueError("Minute must be between 0 and 59") self.minute = minute + if second is not None and not 0 <= second <= 59: + raise ValueError("Second must be between 0 and 59") self.second = second @staticmethod @@ -33,4 +100,43 @@ class datetime(date): return f"{self.year}-{self.month:02}-{self.day:02} {self.hour:02}:{self.minute:02}:{self.second:02}" def __repr__(self): - return f"datetime.datetime({self.year}, {self.month}, {self.day}, {self.hour}, {self.minute}, {self.second})" \ No newline at end of file + return f"datetime.datetime({self.year}, {self.month}, {self.day}, {self.hour}, {self.minute}, {self.second})" + + def __eq__(self, other) -> bool: + if type(other) is not datetime: + return NotImplemented + return (self.year, self.month, self.day, self.hour, self.minute, self.second) ==\ + (other.year, other.month, other.day, + other.hour, other.minute, other.second) + + def __lt__(self, other) -> bool: + if type(other) is not datetime: + return NotImplemented + return (self.year, self.month, self.day, self.hour, self.minute, self.second) <\ + (other.year, other.month, other.day, + other.hour, other.minute, other.second) + + def __le__(self, other) -> bool: + if type(other) is not datetime: + return NotImplemented + return (self.year, self.month, self.day, self.hour, self.minute, self.second) <=\ + (other.year, other.month, other.day, + other.hour, other.minute, other.second) + + def __gt__(self, other) -> bool: + if type(other) is not datetime: + return NotImplemented + return (self.year, self.month, self.day, self.hour, self.minute, self.second) >\ + (other.year, other.month, other.day, + other.hour, other.minute, other.second) + + def __ge__(self, other) -> bool: + if type(other) is not datetime: + return NotImplemented + return (self.year, self.month, self.day, self.hour, self.minute, self.second) >=\ + (other.year, other.month, other.day, + other.hour, other.minute, other.second) + + def timestamp(self) -> float: + raise NotImplementedError + diff --git a/tests/80_datetime.py b/tests/80_datetime.py new file mode 100644 index 00000000..d5c3e3f7 --- /dev/null +++ b/tests/80_datetime.py @@ -0,0 +1,39 @@ +import datetime + + +def test_timedelta(): + assert datetime.timedelta(days=1) == datetime.timedelta(days=1) + assert datetime.timedelta(days=1) != datetime.timedelta(days=2) + assert datetime.timedelta(days=1, seconds=1) >= datetime.timedelta(days=1) + assert datetime.timedelta(days=0, seconds=1) <= datetime.timedelta(days=1) + assert datetime.timedelta(days=1, seconds=1) < datetime.timedelta(days=2) + assert datetime.timedelta(days=1, seconds=1) > datetime.timedelta(days=0) + + +def test_date(): + assert datetime.date(2023, 8, 5) == datetime.date(2023, 8, 5) + assert datetime.date(2023, 8, 5) != datetime.date(2023, 8, 6) + assert datetime.date(2024, 8, 5) >= datetime.date(2023, 8, 6) + assert datetime.date(2023, 8, 5) <= datetime.date(2023, 8, 6) + assert datetime.date(2024, 8, 5) > datetime.date(2023, 8, 6) + assert datetime.date(2023, 8, 5) < datetime.date(2024, 8, 6) + + +def test_datetime(): + assert datetime.datetime( + 2023, 8, 5, 12, 0, 0) == datetime.datetime(2023, 8, 5, 12, 0, 0) + assert datetime.datetime( + 2023, 8, 5, 12, 0, 0) != datetime.datetime(2023, 8, 5, 12, 1, 0) + assert datetime.datetime( + 2023, 8, 5, 12, 0, 0) >= datetime.datetime(2023, 8, 5, 12, 0, 0) + assert datetime.datetime( + 2023, 8, 5, 12, 30, 0) > datetime.datetime(2023, 8, 5, 12, 1, 0) + assert datetime.datetime( + 2023, 8, 5, 12, 0, 0) < datetime.datetime(2023, 8, 5, 12, 1, 0) + assert datetime.datetime( + 2023, 8, 5, 12, 0, 0) <= datetime.datetime(2023, 8, 5, 12, 1, 0) + + +test_timedelta() +test_date() +test_datetime()