Django timezone.make_aware在2014-10-26 1:45:00引发了AmbiguousTimeError

hlo*_*orm 5 python django timezone pytz

我发现了一些奇怪的东西.这里有一些例子.

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
Run Code Online (Sandbox Code Playgroud)

然后开始有趣

print timezone.make_aware(d+timezone.timedelta(minutes=15),TZ)
#out: 2014-10-26 02:00:00+03:00
print timezone.make_aware(d+timezone.timedelta(minutes=14),TZ)
#raised AmbiguousTimeError
print timezone.make_aware(d-timezone.timedelta(minutes=46),TZ)
#out: 2014-10-26 00:59:00+04:00
print timezone.make_aware(d-timezone.timedelta(minutes=45),TZ)
#raised AmbiguousTimeError     
Run Code Online (Sandbox Code Playgroud)

因此AmbiguousTimeError在2014-10-26 00:59:00和2014-10-26 02:00:00之间提出

为什么?怎么解决呢?

jfs*_*jfs 3

timezon.make_aware(d, TZ)相当于在TZ.localize(d, is_dst=None)不明确的时间引发错误:2014-10-26 01:45:00在欧洲/莫斯科时区发生两次:

\n\n
# Europe/Moscow               UTC                           timestamp\n2014-10-26 00:45:00 MSK+0400; 2014-10-25 20:45:00 UTC+0000; 1414269900\n2014-10-26 01:00:00 MSK+0400; 2014-10-25 21:00:00 UTC+0000; 1414270800\n2014-10-26 01:15:00 MSK+0400; 2014-10-25 21:15:00 UTC+0000; 1414271700\n2014-10-26 01:30:00 MSK+0400; 2014-10-25 21:30:00 UTC+0000; 1414272600\n2014-10-26 01:45:00 MSK+0400; 2014-10-25 21:45:00 UTC+0000; 1414273500\n2014-10-26 01:15:00 MSK+0300; 2014-10-25 22:15:00 UTC+0000; 1414275300\n2014-10-26 01:30:00 MSK+0300; 2014-10-25 22:30:00 UTC+0000; 1414276200\n2014-10-26 01:45:00 MSK+0300; 2014-10-25 22:45:00 UTC+0000; 1414277100\n2014-10-26 02:00:00 MSK+0300; 2014-10-25 23:00:00 UTC+0000; 1414278000\n
Run Code Online (Sandbox Code Playgroud)\n\n

注意:UTC 偏移量在凌晨 2 点从 更改为 ( +0400\ xd0\xa4\xd0\xb5\xd0\xb4\xd0\xb5\xd1\x80\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd1 \x8b\xd0\xb9 \xd0\xb7\xd0\xb0\xd0\xba\xd0\xbe\xd0\xbd \xd0\xbe\xd1\x82 21 \xd0\xb8\xd1\x8e\xd0\xbb\xd1\ x8f 2014 \xd0\xb3.N 248-\xd0\xa4\xd0\x97)。+0300

\n\n

为了避免异常,您可以调用TZ.localize(d)(注意: no is_dst=None),它对于现有的非模糊时间工作正常,但对于不存在或模糊时间可能会失败(返回错误答案)。

\n\n

如果pytz Bug #1378150:增强对类似于 DST 结束的模糊时间的支持已修复,那么您可以使用TZ.localize(d, is_dst=True),TZ.localize(d, is_dst=False) 来相应地获取转换之前和之后的时间。

\n\n

如果错误未修复,您可以使用我在观察夏令时时解析本地时间(到 UTC)中的有序时间戳的答案来获取转换后的时间:

\n\n
# Europe/Moscow               UTC                           timestamp\n2014-10-26 00:45:00 MSK+0400; 2014-10-25 20:45:00 UTC+0000; 1414269900\n2014-10-26 01:00:00 MSK+0400; 2014-10-25 21:00:00 UTC+0000; 1414270800\n2014-10-26 01:15:00 MSK+0400; 2014-10-25 21:15:00 UTC+0000; 1414271700\n2014-10-26 01:30:00 MSK+0400; 2014-10-25 21:30:00 UTC+0000; 1414272600\n2014-10-26 01:45:00 MSK+0400; 2014-10-25 21:45:00 UTC+0000; 1414273500\n2014-10-26 01:15:00 MSK+0300; 2014-10-25 22:15:00 UTC+0000; 1414275300\n2014-10-26 01:30:00 MSK+0300; 2014-10-25 22:30:00 UTC+0000; 1414276200\n2014-10-26 01:45:00 MSK+0300; 2014-10-25 22:45:00 UTC+0000; 1414277100\n2014-10-26 02:00:00 MSK+0300; 2014-10-25 23:00:00 UTC+0000; 1414278000\n
Run Code Online (Sandbox Code Playgroud)\n