To round up to the nearest 30 minutes:
#!/usr/bin/env python3
from datetime import datetime, timedelta
def ceil_dt(dt, delta):
return dt + (datetime.min - dt) % delta
now = datetime.now()
print(now)
print(ceil_dt(now, timedelta(minutes=30)))
The formula is suggested by @Mark Dickinson (for a different question).
Output
2015-09-22 19:08:34.839915
2015-09-22 19:30:00
Note: if the input is timezone-aware datetime object such as EASTERN_NOW
in your case then you should call timezone.make_aware(rounded_dt.replace(tzinfo=None))
if you want to preserve the rounded local time and to attach the correct tzinfo, otherwise you may get wrong timezone info if the rounding crosses DST boundaries. Or to avoid failing for ambiguous local time, call .localize()
manually:
localize = getattr(rounded_dt.tzinfo, 'localize', None)
if localize:
rounded_dt = localize(rounded_dt.replace(tzinfo=None),
is_dst=bool(rounded_dt.dst()))
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…