timezone.localize不能按预期工作

时间:2018-08-29 09:53:15

标签: python datetime timezone

当前,我试图了解timezone.localize的工作方式。

原始日期时间(没有时区信息)

现在,我尝试创建一个简单的日期时间(没有时区信息)。我认为一切都会尊重UTC

>>> d = datetime.datetime.fromtimestamp(1535500800)
>>> d
datetime.datetime(2018, 8, 29, 0, 0)
>>> time.mktime(d.timetuple())
1535500800.0
>>> d.hour
0

https://www.epochconverter.com/的屏幕截图,使用1535500800作为时间戳。红色矩形表示UTC时区) enter image description here


一切似乎都很好。现在,我想尝试timezone.localize


带有时区的datetime使用timezone.localize

>>> d = datetime.datetime.fromtimestamp(1535500800)
>>> d
datetime.datetime(2018, 8, 29, 0, 0)
>>> kl_timezone = timezone('Asia/Kuala_Lumpur')
>>> d = kl_timezone.localize(d)
>>> d
datetime.datetime(2018, 8, 29, 0, 0, tzinfo=<DstTzInfo 'Asia/Kuala_Lumpur' +08+8:00:00 STD>)
>>> time.mktime(d.timetuple())
1535500800.0
>>> d.hour
0

https://www.epochconverter.com/的屏幕截图,使用1535500800作为时间戳。蓝色矩形表示吉隆坡时区)

enter image description here

蓝色矩形中突出显示的时间信息是吉隆坡时区。因此,我期望在运行d = kl_timezone.localize(d)之后,d.hour将返回8。

这是因为

  • 给定1535500800时间戳记,UTC居民将其视为上午12:00
  • 鉴于1535500800的时间戳,吉隆坡居民将其视为上午8:00

但是,即使我使用了d.hourkl_timezone.localize(d)仍返回0。

d.hour是否应返回8,因为在时间戳1535500800,吉隆坡是上午8:00?

我对timezone.localize的期望有误吗?

1 个答案:

答案 0 :(得分:2)

datetime.fromtimestamp实际上将转换为本地时区中的时间戳。要获取有关UTC的时间戳,可以使用datetime.utcfromtimestamp。从那里,您可以使用localizereplace使其意识到。然后,要确定在吉隆坡几点钟,您可以使用astimezone

>>> from datetime import datetime
>>> import pytz
>>> from pytz import timezone
>>> d = datetime.utcfromtimestamp(1535500800)  # naive
>>> d
datetime.datetime(2018, 8, 29, 0, 0)
>>> utc_tz = timezone('UTC')
>>> utc_d = utc_tz.localize(d)  # or utc_d = d.replace(tzinfo=pytz.utc)
>>> utc_d
datetime.datetime(2018, 8, 29, 0, 0, tzinfo=<UTC>)
>>> kl_tz = timezone('Asia/Kuala_Lumpur')
>>> kl_d = utc_d.astimezone(kl_tz)  # convert from UTC to Malaysia
>>> kl_d
datetime.datetime(2018, 8, 29, 8, 0, tzinfo=<DstTzInfo 'Asia/Kuala_Lumpur' +08+8:00:00 STD>)

要返回POSIX时间戳,您可以使用timestamp

>>> kl_d.timestamp()
>>> 1535500800.0