Python 夏令时和时区检测添加后

7 投票
1 回答
638 浏览
提问于 2025-04-17 02:44

我现在有一行代码,看起来是这样的:

        t1 = datetime(self.year, self.month, self.day, self.hour, self.minute, self.second)
        ...
        t2 = timedelta(days=dayNum, hours=time2.hour, minutes=time2.minute, seconds=time2.second)
        sumVal = t1 + t2

我希望结果能够考虑到夏令时(DST)可能带来的影响。比如说,如果我在2012年11月4日的凌晨00:30,然后加上3个小时,我希望得到的是02:30,因为那时候夏令时会调整时间。 我查过pytz和python-dateutil这两个库,但它们似乎都不支持这个功能,或者说不支持在没有单独的包含所有时区的文件的情况下使用。更麻烦的是,时间可能并不在当前系统的时区内,甚至可能是过去的时间。我相信用Python应该有简单的方法可以做到这一点,但现在似乎没有一个符合我需求的解决方案。有没有什么好的建议呢?

1 个回答

5

也许你需要的是 pytznormalize 方法:

import datetime as dt
import pytz

tz=pytz.timezone('Europe/London')
t1 = dt.datetime(2012,10,28,0,30,0)
t1=tz.localize(t1)
t2 = dt.timedelta(hours=3)
sumVal = t1 + t2

sumVal 仍然在 BST 时区:

print(repr(sumVal))
# datetime.datetime(2012, 10, 28, 3, 30, tzinfo=<DstTzInfo 'Europe/London' BST+1:00:00 DST>)

经过标准化后,sumVal 转换为 GMT 时区:

sumVal = tz.normalize(sumVal)
print(repr(sumVal))
# datetime.datetime(2012, 10, 28, 2, 30, tzinfo=<DstTzInfo 'Europe/London' GMT0:00:00 STD>)

注意,对于伦敦,夏令时的转换发生在 2012-10-28 02:00:00

撰写回答