nominaldelta

nominal difference of date/datetime
git clone https://git.ce9e.org/nominaldelta.git

commit
5c4066138e4f98b05a79894aed50d6b3ce198f7c
parent
4df4b092e695b4ab754261fca1d96d7862081fbe
Author
Tobias Bengfort <tobias.bengfort@posteo.de>
Date
2024-09-09 17:45
fix: keep time on add date on dst

Diffstat

M nominaldelta.py 8 ++------
M test.py 17 ++++++++++++++++-

2 files changed, 18 insertions, 7 deletions


diff --git a/nominaldelta.py b/nominaldelta.py

@@ -6,10 +6,6 @@ Self = TypeVar('Self', bound='NominalDelta')
    6     6 Date = TypeVar('Date', bound=date)
    7     7 
    8     8 
    9    -1 def date_to_timestamp(d):
   10    -1     return datetime(d.year, d.month, d.day).timestamp()
   11    -1 
   12    -1 
   13     9 def date_add(dt, delta):
   14    10     total_months = dt.year * 12 + dt.month + delta.months
   15    11     year, month = divmod(total_months, 12)
@@ -31,9 +27,9 @@ def date_add(dt, delta):
   31    27 
   32    28 def dt_add(dt, delta):
   33    29     d = date_add(dt.date(), delta)
   34    -1     offset = dt.timestamp() - date_to_timestamp(dt.date())
   -1    30     tmp = dt.__class__.combine(d, dt.time(), tzinfo=dt.tzinfo)
   35    31     return dt.__class__.fromtimestamp(
   36    -1         date_to_timestamp(d) + offset + delta.seconds, tz=dt.tzinfo
   -1    32         tmp.timestamp() + delta.seconds, tz=dt.tzinfo
   37    33     )
   38    34 
   39    35 

diff --git a/test.py b/test.py

@@ -245,7 +245,7 @@ class AdditionTests(unittest.TestCase):
  245   245             datetime(2009, 9, 3, 0, 30, 30, 500000),
  246   246         )
  247   247 
  248    -1     def test_add_datetime_dst(self):
   -1   248     def test_add_datetime_dst_minutes(self):
  249   249         tz = ZoneInfo('Europe/Berlin')
  250   250         self.assertEqual(
  251   251             datetime(2019, 3, 31, 1, 59, tzinfo=tz) + NominalDelta(minutes=2),
@@ -260,6 +260,21 @@ class AdditionTests(unittest.TestCase):
  260   260             datetime(2019, 3, 31, 3, 30, tzinfo=tz),
  261   261         )
  262   262 
   -1   263     def test_add_datetime_dst_days(self):
   -1   264         tz = ZoneInfo('Europe/Berlin')
   -1   265         self.assertEqual(
   -1   266             datetime(2019, 3, 30, 1, 30, tzinfo=tz) + NominalDelta(days=1),
   -1   267             datetime(2019, 3, 31, 1, 30, tzinfo=tz),
   -1   268         )
   -1   269         self.assertEqual(
   -1   270             datetime(2019, 3, 30, 2, 30, tzinfo=tz) + NominalDelta(days=1),
   -1   271             datetime(2019, 3, 31, 3, 30, tzinfo=tz),
   -1   272         )
   -1   273         self.assertEqual(
   -1   274             datetime(2019, 3, 30, 3, 30, tzinfo=tz) + NominalDelta(days=1),
   -1   275             datetime(2019, 3, 31, 3, 30, tzinfo=tz),
   -1   276         )
   -1   277 
  263   278     def test_sub_datetime(self):
  264   279         self.assertEqual(
  265   280             datetime(1970, 1, 30, 13) - NominalDelta(days=1),