Skip to content

Commit 76d2eb1

Browse files
committed
fix: handle DST folded dates with start/end_of
1 parent c4e518c commit 76d2eb1

File tree

2 files changed

+36
-1
lines changed

2 files changed

+36
-1
lines changed

pendulum/datetime.py

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

207207
return self.__class__.create(
208-
year, month, day, hour, minute, second, microsecond, tz=tz
208+
year, month, day, hour, minute, second, microsecond, tz=tz, fold=self.fold
209209
)
210210

211211
@property

tests/datetime/test_start_end_of.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -276,10 +276,45 @@ def test_start_of_with_transition():
276276
assert d.start_of("day").offset == 7200
277277
assert d.start_of("year").offset == 3600
278278

279+
def test_start_of_on_date_before_transition():
280+
d = pendulum.datetime(2013, 10, 27, 0, 59, 59, tz="UTC").in_timezone("Europe/Paris")
281+
assert d.offset == 7200
282+
assert d.start_of("minute").offset == 7200
283+
assert d.start_of("hour").offset == 7200
284+
assert d.start_of("day").offset == 7200
285+
assert d.start_of("month").offset == 7200
286+
assert d.start_of("year").offset == 3600
287+
288+
def test_start_of_on_date_after_transition():
289+
d = pendulum.datetime(2013, 10, 27, 1, 59, 59, tz="UTC").in_timezone("Europe/Paris")
290+
assert d.offset == 3600
291+
assert d.start_of("minute").offset == 3600
292+
assert d.start_of("hour").offset == 3600
293+
assert d.start_of("day").offset == 7200
294+
assert d.start_of("month").offset == 7200
295+
assert d.start_of("year").offset == 3600
279296

280297
def test_end_of_with_transition():
281298
d = pendulum.datetime(2013, 3, 31, tz="Europe/Paris")
282299
assert d.offset == 3600
283300
assert d.end_of("month").offset == 7200
284301
assert d.end_of("day").offset == 7200
285302
assert d.end_of("year").offset == 3600
303+
304+
def test_end_of_on_date_before_transition():
305+
d = pendulum.datetime(2013, 10, 27, 0, 0, 0, tz="UTC").in_timezone("Europe/Paris")
306+
assert d.offset == 7200
307+
assert d.end_of("minute").offset == 7200
308+
assert d.end_of("hour").offset == 7200
309+
assert d.end_of("day").offset == 3600
310+
assert d.end_of("month").offset == 3600
311+
assert d.end_of("year").offset == 3600
312+
313+
def test_end_of_on_date_after_transition():
314+
d = pendulum.datetime(2013, 10, 27, 1, 0, 0, tz="UTC").in_timezone("Europe/Paris")
315+
assert d.offset == 3600
316+
assert d.end_of("minute").offset == 3600
317+
assert d.end_of("hour").offset == 3600
318+
assert d.end_of("day").offset == 3600
319+
assert d.end_of("month").offset == 3600
320+
assert d.end_of("year").offset == 3600

0 commit comments

Comments
 (0)