为什么用pytz中的tzinfo创建日期时间会显示奇怪的时间偏移?

时间:2017-08-18 11:16:09

标签: python datetime timezone pytz

有人可以解释一下我为什么不能得到相同的结果吗?

2017-10-25 20:10:50+01:35

此代码的输出为:import datetime,pytz var1 = datetime.datetime(2017,10,25,20,10,50) var1 = pytz.timezone("Europe/Athens").localize(var1) print(var1)

2017-10-25 20:10:50+03:00

此代码的输出为:3:00

我的问题是为什么他们有不同的时区(1:35和3:00)。我知道第二个代码是真的,因为我的UTC是1:35。但是你能告诉我为什么我会在第一个中获得use_frameworks! source 'https://github.com/CocoaPods/Specs.git' target 'ProjectName' do pod 'AFNetworking', '~> 3.0' # Pods for ProjectName end 吗?

3 个答案:

答案 0 :(得分:2)

tzinfo对某些时区不起作用,这可能是导致错误结果的原因。 pytz doc

  

不幸的是,对于许多时区,使用标准日期时间构造函数的'tzinfo参数''与pytz不起作用。

使用localizeastimezone是解决此问题的方法。 Doc说处理时间的首选方法是始终使用UTC,仅在生成输出以供人类阅读时转换为本地时间

import datetime, pytz
localTimezone = pytz.timezone('Europe/Athens')
var1 = datetime.datetime(2017,10,25,20,10,50,tzinfo=pytz.utc) 
loc_dt = var1.astimezone(localTimezone)
fmt = '%Y-%m-%d %H:%M:%S %Z%z'
print(loc_dt.strftime(fmt))  

这将打印

2017-10-25 23:10:50 EEST+0300

答案 1 :(得分:2)

没有问题,datetime只是愉快地报告tzinfo在任何参考框架中的偏移量。

默认情况下,pytz.timezone不会给出UTC偏移量,而是LMT (local mean time)偏移量:

>>> pytz.timezone("Europe/Athens")
<DstTzInfo 'Europe/Athens' LMT+1:35:00 STD>
#                          ^^^-------------------- local mean time

但是当你本地化时:

>>> var1 = datetime.datetime(2017,10,25,20,10,50)
>>> var1 = pytz.timezone("Europe/Athens").localize(var1)
>>> var1.tzinfo
<DstTzInfo 'Europe/Athens' EEST+3:00:00 DST>
#                          ^^^^-------------------- eastern european summer time

现在报告了一个不同的偏移量,这次是基于EEST。

答案 2 :(得分:1)

在第二个代码中,您使用.localize(),它接受​​一个天真的日期时间对象并将其解释为就像它在该时区中一样。它不会将时间转移到另一个时区。天真的日期时间对象没有时区信息,无法使该移动成为可能。

在第二个代码中将时间设为本地时,第二个代码中显示的时间是正确的。当您在第一个代码中将时间设为本地时,显示的时间不正确。