【发布时间】:2014-11-19 05:38:16
【问题描述】:
我正在测试如何在夏令时更改前后计算和显示日期(使用时区代码)。
在英国,2014 年 3 月 30 日凌晨 1 点,我们进入 DST,然后从 GMT 转到 BST。时间从2014-03-30 00:59:59 GMT跳转到2014-03-30 02:00:00 BST。
我遇到了一个奇怪的问题,用以下代码复制它:
import pytz
from datetime import datetime, time, timedelta
def is_dst(d, tz):
assert d.tzinfo is None # we want a naive datetime to localize
return tz.localize(d).dst() != timedelta(0)
start_datetime = datetime(2014, 03, 30, 0, 0, 0)
tz = pytz.timezone('Europe/London')
# Increment using timedelta
print 'This doesn\'t work:'
d = start_datetime
for i in range(5):
print str(d) + ' ' + tz.tzname(d, is_dst=is_dst(d, tz))
d += timedelta(minutes=30) # Add 30 minutes
# Increment by adding seconds to epoch
print 'This works:'
epoch = datetime.utcfromtimestamp(0)
timestamp = (start_datetime - epoch).total_seconds()
for i in range(5):
d = datetime.fromtimestamp(timestamp)
print str(d) + ' ' + tz.tzname(d, is_dst=is_dst(d, tz))
timestamp += 30 * 60 # Add 30 minutes
输出是:
This doesn't work:
2014-03-30 00:00:00 GMT
2014-03-30 00:30:00 GMT
2014-03-30 01:00:00 GMT <- invalid time
2014-03-30 01:30:00 GMT <- invalid time
2014-03-30 02:00:00 BST
This works:
2014-03-30 00:00:00 GMT
2014-03-30 00:30:00 GMT
2014-03-30 02:00:00 BST
2014-03-30 02:30:00 BST
2014-03-30 03:00:00 BST
我已经在输出上标记了无效时间的位置。挂钟上不存在这些时间,2014 年 3 月 30 日没有凌晨 1 点或 1:30,所以我不确定为什么要显示它。
相同的过程但以略微不同的方式完成会产生正确的结果。这是为什么呢?
【问题讨论】:
标签: python datetime timezone pytz