dav*_*idn 9 python timezone datetime timedelta dst
我想在本地化日期时间对象中添加或减去周(或天或月或年).问题是,由于夏令时区,天真的方法将导致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)
Run Code Online (Sandbox Code Playgroud)
我想知道是否有更通用/更好的解决方案.有没有可以解决这个问题的图书馆?这似乎是一个非常普遍的问题.
gon*_*opp 15
timedelta(days=7)意味着7天,如7*24小时 - 而不是"太阳日".如果您将7天添加到时区感知日期时间,您将获得7天后的日期时间 - 与时区中日期时间的表示无关.
看起来你真正想要的是将delta应用到你指定的时间,忽略时区细节.注意区别:
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
Run Code Online (Sandbox Code Playgroud)
因此,如果可能,请在本地化之前将增量应用于日期时间.
| 归档时间: |
|
| 查看次数: |
2009 次 |
| 最近记录: |