我想知道python是否区分左手(左手)和右手(右手)时间戳。在DST天本地化时间戳时,这会成为一个问题。
假设我在当地欧洲时间有半小时的右手标记值,其中DST在2014年3月30日的02:00到03:00之间发生了变化。
2014-03-30 00:30:00
2014-03-30 01:00:00
2014-03-30 01:30:00
2014-03-30 02:00:00
2014-03-30 03:30:00
2014-03-30 04:00:00
如果我想本地化这些时间戳,我自然会收到错误:
NonExistentTimeError: 2014-03-30 02:00:00
因为当天我当地时区没有时间戳02:00。所以我想知道python是否可以区分左/右手时间戳?
答案 0 :(得分:0)
我认为正确的方法是在进行任何算术时使用UTC,并使用支持DST更改的pytz
包从/转换为UTC。
答案 1 :(得分:0)
pytz
允许您使用is_dst
参数在DST转换之前/之后选择utc偏移量:
>>> import pytz
>>> tz = pytz.timezone('Europe/Paris')
>>> from datetime import datetime
>>> naive = datetime.strptime('2014-03-30 02:00:00', '%Y-%m-%d %H:%M:%S')
>>> tz.localize(naive, is_dst=None)
Traceback (most recent call last)
...
NonExistentTimeError: 2014-03-30 02:00:00
>>> tz.localize(naive) #XXX WRONG
datetime.datetime(2014, 3, 30, 2, 0, tzinfo=<DstTzInfo 'Europe/Paris' CET+1:00:00 STD>)
>>> tz.normalize(tz.localize(naive)) # you want this (default is after the transition)
datetime.datetime(2014, 3, 30, 3, 0, tzinfo=<DstTzInfo 'Europe/Paris' CEST+2:00:00 DST>)
>>> tz.localize(naive, is_dst=False) #XXX WRONG
datetime.datetime(2014, 3, 30, 2, 0, tzinfo=<DstTzInfo 'Europe/Paris' CET+1:00:00 STD>)
>>> tz.localize(naive, is_dst=True) #XXX WRONG
datetime.datetime(2014, 3, 30, 2, 0, tzinfo=<DstTzInfo 'Europe/Paris' CEST+2:00:00 DST>)
>>> tz.normalize(tz.localize(naive, is_dst=False)) # time corresponding to the offset
datetime.datetime(2014, 3, 30, 3, 0, tzinfo=<DstTzInfo 'Europe/Paris' CEST+2:00:00 DST>)
>>> tz.normalize(tz.localize(naive, is_dst=True)) # time corresponding to the offset
datetime.datetime(2014, 3, 30, 1, 0, tzinfo=<DstTzInfo 'Europe/Paris' CET+1:00:00 STD>)