当前,我试图了解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时区)
一切似乎都很好。现在,我想尝试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作为时间戳。蓝色矩形表示吉隆坡时区)
蓝色矩形中突出显示的时间信息是吉隆坡时区。因此,我期望在运行d = kl_timezone.localize(d)
之后,d.hour
将返回8。
这是因为
但是,即使我使用了d.hour
,kl_timezone.localize(d)
仍返回0。
d.hour
是否应返回8,因为在时间戳1535500800,吉隆坡是上午8:00?
我对timezone.localize
的期望有误吗?
答案 0 :(得分:2)
datetime.fromtimestamp
实际上将转换为本地时区中的时间戳。要获取有关UTC的时间戳,可以使用datetime.utcfromtimestamp
。从那里,您可以使用localize
或replace
使其意识到。然后,要确定在吉隆坡几点钟,您可以使用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