python右侧与左侧时间戳和DST
我想知道python是否区分了左侧(左旋)和右侧(右旋)时间戳。在DST日本地化时间戳时,这会成为一个问题 假设我在当地欧洲时间右键标记了半小时值,2014年3月30日,DST从02:00到03:00发生了变化python右侧与左侧时间戳和DST,python,dst,timestamp-with-timezone,Python,Dst,Timestamp With Timezone,我想知道python是否区分了左侧(左旋)和右侧(右旋)时间戳。在DST日本地化时间戳时,这会成为一个问题 假设我在当地欧洲时间右键标记了半小时值,2014年3月30日,DST从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 如果我想本地化这些时间戳,我自然会得到一个错误
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是否能够区分左手/右手时间戳?我认为正确的方法是在做任何算术时使用UTC,并使用
pytz
包从UTC转换到UTC,它支持DST更改。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>)
导入pytz
>>>tz=pytz.时区(“欧洲/巴黎”)
>>>从日期时间导入日期时间
>>>naive=datetime.strtime('2014-03-30 02:00:00','%Y-%m-%d%H:%m:%S')
>>>本地化(天真,isdst=None)
回溯(最近一次呼叫最后一次)
...
不存在时间错误:2014-03-30 02:00:00
>>>tz.本地化(幼稚)#XXX错误
datetime.datetime(2014,3,30,2,0,tzinfo=)
>>>规格化(tz.localize(naive))#您需要它(默认值是在转换之后)
datetime.datetime(2014,3,30,3,0,tzinfo=)
>>>tz.localize(天真,是否u dst=False)#XXX错误
datetime.datetime(2014,3,30,2,0,tzinfo=)
>>>z.localize(天真,u dst=True)#XXX错了
datetime.datetime(2014,3,30,2,0,tzinfo=)
>>>tz.normalize(tz.localize(naive,isdst=False))与偏移量对应的时间
datetime.datetime(2014,3,30,3,0,tzinfo=)
>>>tz.normalize(tz.localize(naive,isdst=True))与偏移量对应的时间
datetime.datetime(2014,3,30,1,0,tzinfo=)
如果您确定时间戳严格递增,则可能不存在TimeError表明您的输入错误或您使用了错误的时区来解释它。我处理时间问题已经有很长一段时间了,我从未听说过“左手”与“右手”或“左旋”与“右旋”这两个术语应用于时间戳。如果这是一个已知的事情,我只是没有听说过,那么请告诉我你的来源。不管是哪种方式,请准确解释你所说的区别是什么意思,这样其他人也可以学习。@Matt:想想在一个时间间隔内记录的数据,比如30分钟,但数据采样系统只存储聚合值,通常是该时间间隔内的平均值、最大值、最小值。那么时间戳,比如02:00,是不明确的,因为它可能指的是间隔[01:30-02:00]或间隔[02:00-02:30]。前一种情况是右手盖章,后一种情况是左手盖章。希望这能解释得更清楚!当涉及时间时,通常使用半开间隔。示例:
[01:30-2:00][02:00-2:30)
。按照您的术语,这些时间间隔是“左戳”的。我从未遇到过右戳的时间间隔。想想您可能参加过的任何事件-结束时间是事件结束时,因此它不是该时间间隔的一部分。