- 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 247248 -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),