Python中的右手时间戳与左手时间戳以及夏令时

3
我想知道Python是否区分左手(左撇子)和右手(右撇子)时间戳。这在本地化DST日期的时间戳时会成为问题。
假设我有欧洲当地时间的右手时间戳半小时值,在2014年3月30日的2:00到3:00之间发生了DST更改。
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是否可以区分左/右手的时间戳?


如果你确定时间戳严格递增,那么你可以使用pytz模块来解析它们。 - jfs
NonExistentTimeError 表示您的输入可能有误或者您使用了错误的时区进行解释。 - jfs
1
我一直在处理时间问题,但从未听说过“左手”与“右手”,或者“sinistral”与“dextral”这些术语用于时间戳。如果这是一个已知的事情,只是我没有听说过,请指出你的来源。无论如何,请解释一下你所说的区别,以便其他人也能学习。 - Matt Johnson-Pint
@Matt:考虑一下在一个时间间隔内记录的数据,比如30分钟,但是数据采样系统只存储该时间间隔内的聚合值,通常是平均值、最大值和最小值。那么一个时间戳,比如02:00就是有歧义的,因为它可能指的是区间[01:30-02:00]或区间[02:00-02:30]。前者是右端时间戳,后者是左端时间戳。希望这样更清楚地解释了! - alx
在涉及时间的情况下,使用半开区间是常见的做法。例如:[01:30-2:00)[02:00-2:30)。按照您的术语,这些将被称为“左手戳”。我从未遇到过右手戳的时间间隔。想想你可能参加过的任何事件 - 结束时间是事件结束的时间,因此它不是该区间的一部分。 - Matt Johnson-Pint
2个回答

0

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


0

pytz 允许您使用 is_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>)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接