如何解决Python的时区时间戳Wierdness
我发现在Python中不同的时区一个很奇怪的行为。以下代码:
import datetime as dtm
import pytz
def test_tz():
america_ny_tz: dtm.tzinfo = pytz.timezone("America/New_York")
est_tz: dtm.tzinfo = pytz.timezone("EST5EDT")
today = dtm.date.today()
ny_dtm = dtm.datetime(
year=today.year,month=today.month,day=today.day,tzinfo=america_ny_tz
)
est_dtm = dtm.datetime(
year=today.year,tzinfo=est_tz
)
print(f"New York: {ny_dtm.timestamp()},EST: {est_dtm.timestamp()}")
if __name__ == "__main__":
test_tz()
输出:
New York: 1609995360.0,EST: 1609995600.0
正如您可能注意到的,差异大约是 4 分钟,您必须假设时间应该相同。
我是否错误地访问了时区信息,或者我是否理解时区信息应该相同?
运行在Linux,Ubuntu的20.04但18.04行为是相同的。
附言我还没有尝试过其他语言的或不同的OS”以查看是否行为将是相同的。
解决方法
这似乎是因为一个时区使用本地标准时间,而另一个时区是 UTC(世界协调时间)的偏移量。
>>> pytz.timezone("America/New_York")
<DstTzInfo 'America/New_York' LMT-1 day,19:04:00 STD>
>>> pytz.timezone("EST5EDT")
<DstTzInfo 'EST5EDT' EST-1 day,19:00:00 STD>
>>> pytz.timezone("LMT")
来自https://www.timeanddate.com/time/local-mean-time.html
当地标准时间在许多国家被正式用作民用时间 在 19 世纪。每个城市都有不同的当地时间 根据经度,每度相差 4 分钟 经度。这相当于 New 上 50 英里或 81 公里的距离 约克的纬度。
,您需要正确本地化 - 使用 pytz
的时区对象,在创建日期时间对象时直接设置 tzinfo
是不正确的方法。它是in the docs:
这个库只支持两种构建本地化时间的方式。首先是使用pytz库提供的localize()方法。
和
构建本地化时间的第二种方法是使用标准的 astimezone() 方法转换现有的本地化时间
另一方面,如果您碰巧使用 Python 3.9+,则可以使用标准库中的 zoneinfo
模块让您的生活更轻松 - 请参阅 the docs / using-zoneinfo 或 example usage here。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。