3

我想知道 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是否可以区分左/右手时间戳?

4

2 回答 2

0

我认为正确的方法是在进行任何算术运算时使用 UTC,并使用pytz支持 DST 更改的包从/转换为 UTC。

于 2015-06-08T10:29:39.050 回答
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>)
于 2015-06-08T18:04:09.527 回答