我想向本地化日期时间对象添加或减去周(或天、月或年)。问题是,由于夏令时时区,这种天真的方法会导致 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)
我想知道是否有更通用/更好的解决方案。有没有可以解决这个问题的库?这似乎是一个很常见的问题。
timedelta(days=7)
意味着 7 天,如7*24
小时 - 不是“太阳日”。
如果您向时区感知的日期时间添加 7 天,您将获得 7 天后的日期时间 - 无论该日期时间如何代表在时区。
看来您真正想要的是将增量应用到您指定的时间,ignoring时区详细信息。注意区别:
In [13]: print my_tz.normalize( my_tz.localize( dt ) + delta )
2014-04-03 13:00:00+02:00
In [14]: print my_tz.normalize( my_tz.localize( dt + delta ) )
2014-04-03 12:00:00+02:00
因此,如果可能,请在本地化之前将增量应用到日期时间。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)