【问题标题】:When to use datetime.utcnow() or datetime.now(tz=pytz.utc).replace(tzinfo=None)何时使用 datetime.utcnow() 或 datetime.now(tz=pytz.utc).replace(tzinfo=None)
【发布时间】:2017-07-14 23:06:20
【问题描述】:

我想知道什么时候应该使用

datetime.now(tz=pytz.utc).replace(tzinfo=None)

而不是简单地

datetime.utcnow()

后者是否不考虑例如?夏令时?

【问题讨论】:

    标签: python datetime timezone pytz


    【解决方案1】:

    datetime.datetime 的工作方式很大程度上取决于运行它的机器。主机的本地时间和时区设置将决定您将获得的输出。

    如果主机在 UTC 时区,那么 datetime.datetime.now()datetime.datetime.utcnow() 之间没有区别。

    根据pytz documentation

    处理时间的首选方式是始终以 UTC 工作,仅在生成供人类阅读的输出时转换为本地时间。

    pytz 用于计算夏令时,datetime.datetime.utcnow() 用于提供一个通用的标准化参考点,您可以在该参考点上计算夏令时。 datetime.datetime.utcnow() 本身不会考虑夏令时。

    【讨论】:

      【解决方案2】:

      你永远不应该使用datetime.utcnow(),因为它会给你一个幼稚的时间戳,你可以用它来打自己的脚。如果您真的想要一个简单的时间戳,请使用您的第一个选项使其明确。 now() 采用 tz 参数(您应该始终提供该参数,以避免使用主机 TZ)。但是utcnow() 显然没有提供。所以它注定了。

      例如,假设您有一个 UTC 时间戳,并且您想将其转换为墨西哥城的当地时间:

      my_timestamp.astimezone(pytz.timezone("America/Mexico_City"))
      

      看起来不错,对吧?不,看看这个:

      >>> datetime.utcnow()
      datetime.datetime(2021, 3, 29, 21, 40, 44, 329559)
      >>> datetime.utcnow().astimezone(pytz.timezone("America/Mexico_City"))
      datetime.datetime(2021, 3, 29, 21, 40, 44, 329559, tzinfo=<DstTzInfo 'America/Mexico_City' CST-1 day, 18:00:00 STD>)
      

      如您所见,astimezone 如果您给它一个简单的时间戳,它只会添加 tz,而不会按预期调整实际时间。 (如果你不想调整,你会使用.replace

      这非常令人困惑,如果你只是确保你没有幼稚的时间戳,你就不会遇到这样的问题。如果您愿意,您可以将它们放在您的外部 API 中,但在它们进入系统时添加一个时区。

      总结:始终使用datetime.now(tz=some_tz)

      【讨论】:

        猜你喜欢
        • 2020-12-01
        • 2010-09-08
        • 2018-06-03
        • 2011-06-18
        • 2020-09-12
        • 2011-05-03
        • 2018-02-11
        • 2019-07-06
        • 1970-01-01
        相关资源
        最近更新 更多