Skip to content

Commit d62af2b

Browse files
committed
feat(dt): add datetime_range function
1 parent c231aaf commit d62af2b

File tree

1 file changed

+35
-0
lines changed

1 file changed

+35
-0
lines changed

stdl/dt.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,40 @@ def date_range(start: date, end: date) -> Generator[date, None, None]:
233233
yield start + timedelta(n)
234234

235235

236+
def datetime_range(
237+
start: datetime,
238+
end: datetime,
239+
step: timedelta,
240+
) -> Generator[datetime, None, None]:
241+
"""
242+
Returns a generator for datetimes between ``start`` and ``end`` with a given ``step``.
243+
244+
Example:
245+
```python
246+
>>> for dt in datetime_range(
247+
... datetime(2026, 1, 27, 0, 0),
248+
... datetime(2026, 1, 27, 3, 0),
249+
... timedelta(hours=1)
250+
... ):
251+
... print(dt)
252+
2026-01-27 00:00:00
253+
2026-01-27 01:00:00
254+
2026-01-27 02:00:00
255+
```
256+
"""
257+
current = start
258+
if step.total_seconds() == 0:
259+
raise ValueError("step cannot be zero")
260+
if step.total_seconds() > 0:
261+
while current < end:
262+
yield current
263+
current += step
264+
else:
265+
while current > end:
266+
yield current
267+
current += step
268+
269+
236270
def sleep(lo: float, hi: float | None = None) -> float:
237271
"""
238272
Sleeps for a random duration within a specified range.
@@ -346,6 +380,7 @@ def hms_to_seconds(time: str, ms: bool = False) -> float | None:
346380
"time_fmt",
347381
"date_fmt",
348382
"date_range",
383+
"datetime_range",
349384
"sleep",
350385
"local_timezone",
351386
"timezone",

0 commit comments

Comments
 (0)