【发布时间】:2014-08-31 15:19:51
【问题描述】:
我想为本地化的日期时间对象增加或减少几周(或几天、一个月或几年)。问题是,由于夏令时时区,这种天真的方法将导致 1 小时轮班。
2014-03-27 12:00 就在从冬季时间切换到夏季时间之前。例如,如果我在欧洲/柏林时区本地化的该日期添加一周的时间增量,结果将是 2014-04-03 13:00。我想要一天中的同一个小时,2014-04-03 12:00。我找到了解决方案:
from datetime import datetime, timedelta
import pytz
my_tz = pytz.timezone("Europe/Berlin")
def add_relativedelta(date, delta):
"""
Adds the given timedelta to the given date. Shifts in timezone offsets
will be removed.
"""
tz = date.tzinfo
result = tz.normalize(date + delta)
if result.utcoffset() != date.utcoffset():
result = tz.normalize(date.utcoffset() - result.utcoffset() + result)
return result
date = my_tz.localize(datetime(year=2014, month=3, day=27, hour=12, minute=0))
print """{} Original localized date (winter time)
{} One week later (summer time)
{} Date one week later preserving hour of day (summer time)""".format(date,
my_tz.normalize(date + timedelta(days=7)),
add_relativedelta(date, timedelta(days=7)))
2014-03-27 12:00:00+01:00 Original localized date (winter time)
2014-04-03 13:00:00+02:00 One week later (summer time)
2014-04-03 12:00:00+02:00 Date one week later preserving hour of day (summer time)
我想知道是否有更通用/更好的解决方案。有没有可以解决这个问题的库?这似乎是一个很常见的问题。
【问题讨论】:
-
相关;如果您必须包括 DST 更改:stackoverflow.com/q/63579796/10197418
标签: python datetime timezone dst timedelta