为啥 datetime 为同一时区提供不同的时区格式?

Posted

技术标签:

【中文标题】为啥 datetime 为同一时区提供不同的时区格式?【英文标题】:Why does datetime give different timezone formats for the same timezone?为什么 datetime 为同一时区提供不同的时区格式? 【发布时间】:2019-02-12 12:14:48 【问题描述】:
>>> now = datetime.datetime.now(pytz.timezone('Asia/Tokyo'))
>>> dt = datetime(now.year, now.month, now.day, now.hour, now.minute, now.second, now.microsecond, pytz.timezone('Asia/Tokyo'))
>>> now
datetime.datetime(2018, 9, 7, 16, 9, 24, 177751, tzinfo=<DstTzInfo 'Asia/Tokyo' JST+9:00:00 STD>)
>>> dt = datetime(now.year, now.month, now.day, now.hour, now.minute, now.second, now.microsecond, pytz.timezone('Asia/Tokyo'))
>>> dt
datetime.datetime(2018, 9, 7, 16, 9, 24, 177751, tzinfo=<DstTzInfo 'Asia/Tokyo' LMT+9:19:00 STD>)

对于now,我得到了JST+9:00:00,对于dt,我得到了LMT+9:19:00。我不明白为什么datetime 使用不同的格式。

当我比较它们不同的时间时:

>>> now == dt
False

如何将LMT 转换为JST 以便now == dtTrue?我需要使用datetime(2018, 9, 7, 16, 9, 24, 177751, timezone('Asia/Tokyo')),同时我需要JST

【问题讨论】:

什么是 JST 和 LMS? 日本标准时间 && 当地时间 这可能会有所帮助。 ***.com/questions/12626045/… 【参考方案1】:

如a related question's answer 中所述,永远不要使用 datetime() 创建带有时区信息的日期时间。相反,您应该使用localize 在以 UTC 格式创建日期时间后将其转换为 JST。

>>> import pytz
>>> from datetime import datetime
>>>
>>> now = datetime.now(pytz.utc)
>>> dt = datetime(now.year, now.month, now.day, now.hour, now.minute, now.second, now.microsecond, pytz.utc)
>>> jst = pytz.timezone('Asia/Tokyo')
>>> jst.normalize(now)
datetime.datetime(2018, 9, 7, 20, 21, 44, 653897, tzinfo=<DstTzInfo 'Asia/Tokyo' JST+9:00:00 STD>)
>>> jst.normalize(dt)
datetime.datetime(2018, 9, 7, 20, 21, 44, 653897, tzinfo=<DstTzInfo 'Asia/Tokyo' JST+9:00:00 STD>)
>>> now == dt
True

【讨论】:

以上是关于为啥 datetime 为同一时区提供不同的时区格式?的主要内容,如果未能解决你的问题,请参考以下文章

如何将熊猫中的日期时间列全部转换为同一时区

为啥这些日期时间对象时区不相等?

mysql数据库里的日期用timestamp还是datetime好

为啥 JavaScript 会根据结构相同的字符串猜测两个不同的时区?

如何将表单(国家/城市)中的字符串时区转换为 datetime.tzinfo

pytz 为“非洲/喀土穆”提供错误的时区偏移