【问题标题】:How to create a datetime object given seconds since unix epoch?自 Unix 纪元以来,如何在给定秒数的情况下创建日期时间对象?
【发布时间】:2016-06-06 00:49:48
【问题描述】:

在网上做一件非常基本的事情似乎有很多困惑:创建一个带有 UTC 时区的日期时间对象,给定自 UTC 时区中的 unix 纪元以来的秒数。基本上,我总是想在绝对时间/UTC 下工作。

我正在使用 python 3.5(现在是最新版本),并且想从 1970 年 1 月 1 日以来经过的秒数的浮点值在 UTC(+0/Zulu 偏移量)的上下文中简单地获取一个 datetime 对象。

这是错误的,因为第一次是在我的本地时区创建的,然后我尝试切换到 UTC。

import datetime
import pytz
dt = datetime.datetime.fromtimestamp(my_seconds).replace(tzinfo=pytz.UTC)

【问题讨论】:

    标签: python-3.x datetime pytz


    【解决方案1】:

    Python 为这种情况提供了方法utcfromtimestamputcfromtimestamp

    import datetime
    
    seconds = 0
    utcdate_from_timestamp = datetime.datetime.utcfromtimestamp(seconds)
    

    【讨论】:

      【解决方案2】:

      如果 my_seconds 是 POSIX 时间戳,则在 Python 3 中将其转换为 datetime

      #!/usr/bin/env python3
      from datetime import datetime, timedelta, timezone
      
      utc_dt = datetime(1970, 1, 1, tzinfo=timezone.utc) + timedelta(seconds=my_seconds)
      utc_dt = datetime.fromtimestamp(my_seconds, timezone.utc)
      naive_utc_dt = datetime.utcfromtimestamp(my_seconds)
      

      如果您的本地时区是“正确的”(非 POSIX),那么只有第一个公式是正确的(在这种情况下,其他公式将 my_seconds 解释为带有 datetime(1970, 1, 1, 0, 0, 10) TAI 纪元的 TAI 时间戳)。

      The first formula is more portable and may support a wider input range than the others.

      由于rounding errors on some Python versions,第一个和第二个表达式的结果可能不同。

      第 2 次和第 3 次调用的区别仅在于 tzinfo 属性(后者返回一个简单的日期时间对象 (.tzinfo is None))。您应该更喜欢时区感知的日期时间对象,以避免歧义。

      【讨论】:

        猜你喜欢
        • 2011-10-23
        • 2021-06-11
        • 1970-01-01
        • 2021-04-29
        • 2010-11-24
        • 2021-02-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多