【问题标题】:Timezone Timestamp Weirdness时区时间戳怪异
【发布时间】:2021-04-13 07:52:22
【问题描述】:

我发现 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, month=today.month, day=today.day, 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 上的行为是相同的。

附:我没有尝试过其他语言或不同的操作系统来查看行为是否相同。

【问题讨论】:

  • 关于您的 p.s.,您遇到的问题是特定于库的,而不是特定于操作系统的。在 Windows 上遇到同样的问题 ;-) 顺便说一下,请注意数据库中 Olson 先生的 this comment - EST5EDT 已过时。
  • @MrFuppes 我知道EST5EDT 已过时,但仍在使用中,因此是我的问题。

标签: python linux timezone ubuntu-20.04 pytz


【解决方案1】:

这似乎是因为一个时区使用本地标准时间,而另一个时区是 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 公里的距离 约克的纬度。

【讨论】:

  • 如果您不调用 localize,pytz 会回退到使用其数据库中时区的第一个条目——恰好是 LMT。
  • @MrFuppes 应该停在late 19th century
【解决方案2】:

您需要正确本地化 - 使用pytz 的时区对象,在创建日期时间对象时直接设置tzinfo正确的方法。我是in the docs

该库仅支持两种构建本地化时间的方法。第一种是使用pytz库提供的localize()方法。

建立本地化时间的第二种方法是使用标准 astimezone() 方法转换现有本地化时间


另一方面,如果您碰巧使用 Python 3.9+,则可以使用标准库中的 zoneinfo 模块让您的生活更轻松 - 请参阅 the docs / using-zoneinfoexample usage here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-24
    • 2012-06-03
    • 1970-01-01
    • 1970-01-01
    • 2015-06-27
    • 2012-05-06
    • 2023-03-07
    相关资源
    最近更新 更多