我发现了一些奇怪的东西。这里有一些例子。在
from django.utils import timezone
value = u'2014-10-26 01:45:00'
#I know that a variable has 'Europe / Moscow' timezone. Let's tell Django about it.
TZ = timezone.pytz.timezone('Europe/Moscow')
d = timezone.datetime.strptime(value,'%Y-%m-%d %H:%M:%S')
print timezone.make_aware(d,TZ)
#raised AmbiguousTimeError: 2014-10-26 01:45:00
然后乐趣开始了
^{pr2}$因此,在2014-10-26 00:59:00和2014-10-26 02:00:00之间产生了模糊性误差
为什么?怎么解决呢?在
timezon.make_aware(d, TZ)
相当于TZ.localize(d, is_dst=None)
,它会在不明确的时间引起错误:2014-10-26 01:45:00
在欧洲/莫斯科时区发生两次:注意:utc偏移量在凌晨2点(Федеральный закон от 21 июля 2014 г. N 248-ФЗ)从
+0400
更改为+0300
。在为了避免异常,您可以调用
TZ.localize(d)
(注意:nois_dst=None
),它对现有的非歧义时间正常,但对于不存在或不明确的时间,可能会失败(返回错误的答案)。在如果pytz Bug #1378150: Enhance support for end-of-DST-like ambiguous time是固定的,那么可以使用
TZ.localize(d, is_dst=True)
,TZ.localize(d, is_dst=False)
来获得相应的转换前后的时间。在如果错误没有修复,您可以使用我的答案从Parsing of Ordered Timestamps in Local Time (to UTC) While Observing Daylight Saving Time获得转换后的时间:
^{pr2}$因为夏令时。在
10月26日凌晨2点,莫斯科人将把时钟拨回一小时。这意味着他们将看到,例如,在那天凌晨1:30两次。所以凌晨1:00到2:00之间的时间是不明确的,Python/pytz就是这么说的。在
如何处理这个问题将取决于具体的应用程序。你需要决定你说的是哪一个凌晨1:30(即你说的是哪一个UTC时间)。在
(显然,这是大多数俄罗斯人最后一年会与DST打交道。请参阅this article了解一些有趣的背景。)
相关问题 更多 >
编程相关推荐