Skip to content

Commit 599b44b

Browse files
authored
fix: handle DST folded dates with start/end_of (#713)
1 parent f1952cd commit 599b44b

File tree

2 files changed

+41
-1
lines changed

2 files changed

+41
-1
lines changed

pendulum/datetime.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,7 @@ def set(
228228
tz = self.tz
229229

230230
return self.__class__.create(
231-
year, month, day, hour, minute, second, microsecond, tz=tz
231+
year, month, day, hour, minute, second, microsecond, tz=tz, fold=self.fold
232232
)
233233

234234
@property

tests/datetime/test_start_end_of.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -277,9 +277,49 @@ def test_start_of_with_transition():
277277
assert d.start_of("year").offset == 3600
278278

279279

280+
def test_start_of_on_date_before_transition():
281+
d = pendulum.datetime(2013, 10, 27, 0, 59, 59, tz="UTC").in_timezone("Europe/Paris")
282+
assert d.offset == 7200
283+
assert d.start_of("minute").offset == 7200
284+
assert d.start_of("hour").offset == 7200
285+
assert d.start_of("day").offset == 7200
286+
assert d.start_of("month").offset == 7200
287+
assert d.start_of("year").offset == 3600
288+
289+
290+
def test_start_of_on_date_after_transition():
291+
d = pendulum.datetime(2013, 10, 27, 1, 59, 59, tz="UTC").in_timezone("Europe/Paris")
292+
assert d.offset == 3600
293+
assert d.start_of("minute").offset == 3600
294+
assert d.start_of("hour").offset == 3600
295+
assert d.start_of("day").offset == 7200
296+
assert d.start_of("month").offset == 7200
297+
assert d.start_of("year").offset == 3600
298+
299+
280300
def test_end_of_with_transition():
281301
d = pendulum.datetime(2013, 3, 31, tz="Europe/Paris")
282302
assert d.offset == 3600
283303
assert d.end_of("month").offset == 7200
284304
assert d.end_of("day").offset == 7200
285305
assert d.end_of("year").offset == 3600
306+
307+
308+
def test_end_of_on_date_before_transition():
309+
d = pendulum.datetime(2013, 10, 27, 0, 0, 0, tz="UTC").in_timezone("Europe/Paris")
310+
assert d.offset == 7200
311+
assert d.end_of("minute").offset == 7200
312+
assert d.end_of("hour").offset == 7200
313+
assert d.end_of("day").offset == 3600
314+
assert d.end_of("month").offset == 3600
315+
assert d.end_of("year").offset == 3600
316+
317+
318+
def test_end_of_on_date_after_transition():
319+
d = pendulum.datetime(2013, 10, 27, 1, 0, 0, tz="UTC").in_timezone("Europe/Paris")
320+
assert d.offset == 3600
321+
assert d.end_of("minute").offset == 3600
322+
assert d.end_of("hour").offset == 3600
323+
assert d.end_of("day").offset == 3600
324+
assert d.end_of("month").offset == 3600
325+
assert d.end_of("year").offset == 3600

0 commit comments

Comments
 (0)