【问题标题】:Python convert timestamp to unixPython将时间戳转换为unix
【发布时间】:2021-05-25 10:21:14
【问题描述】:

我知道以前有人问过这些问题,但我正在努力将时间戳字符串转换为 unix 时间并弄清楚 datetime 对象是天真还是有意识

例如将时间“2021-05-19 12:51:47”转换为unix:

>>> from datetime import datetime as dt
>>> dt_obj = dt.strptime("2021-05-19 12:51:47", "%Y-%m-%d %H:%M:%S")
>>> dt_obj
datetime.datetime(2021, 5, 19, 12, 51, 47)

dt_obj 天真还是有意识,您将如何确定这一点? dt_obj 上的方法,例如timetztzinfotzname 似乎没有任何指示——这是否意味着 dt_obj 是幼稚的?

然后获取unix:

>>> dt_obj.timestamp()
1621421507.0

但是,当我检查 1621421507.0https://www.unixtimestamp.com 时,它告诉我上面的格林威治标准时间是 2021 年 5 月 19 日星期三 10:51:47 GMT+0000,即比原始时间戳晚 2 小时?

【问题讨论】:

    标签: python datetime unix utc


    【解决方案1】:

    由于Python的datetime默认将naive datetime视为本地时间,所以需要设置时区(tzinfo属性):

    from datetime import datetime, timezone
    
    # assuming "2021-05-19 12:51:47" represents UTC:
    dt_obj = datetime.fromisoformat("2021-05-19 12:51:47").replace(tzinfo=timezone.utc)
    

    或者,正如@Wolf 建议的那样,您也可以通过添加解析为UTC 的"+00:00" 来修改输入字符串,而不是显式设置tzinfo 属性;

    dt_obj = datetime.fromisoformat("2021-05-19 12:51:47" + "+00:00")
    

    无论如何,结果

    dt_obj.timestamp()
    # 1621428707.0
    

    现在可以在https://www.unixtimestamp.com/ 上按预期进行转换:

    【讨论】:

    • 什么反对datetime.fromisoformat("2021-05-19 12:51:47 +00:00")
    • 非常感谢您并在datetime.fromisoformat上注明
    • @Wolf:我已将您的建议添加到答案中,感谢您的评论!我有点不愿意修改字符串,但它显然比使用 replace 更有效。
    • @uroboros:很高兴我能帮上忙!还要注意 Wolf 的建议;如果您要处理大量数据,效率会更高。
    • @Wolf 关于“这不是在一年中的一个小时内出现偏差吗”:您的意思是因为 DST 过渡? - 不,我不这么认为,假设输入字符串代表 UTC。如果它代表当地时间,那么是的。您必须先设置本地时区,然后然后转换为 UTC(然后在需要时获取时间戳)。
    【解决方案2】:

    只要调用strptime时不指定时区,就会产生naivedatetime对象。您可以通过%z 格式说明符传递时区信息,并将+00:00 添加到文本日期时间表示以获取时区感知 datetime 对象:

    from datetime import datetime
    
    dt_str = "2021-05-19 12:51:47"
    print(dt_str)
    dt_obj = datetime.strptime(dt_str+"+00:00", "%Y-%m-%d %H:%M:%S%z")
    print(dt_obj)
    print(dt_obj.timestamp())
    

    上面的脚本是这样的:

    2021-05-19 12:51:47
    2021-05-19 12:51:47+00:00
    1621428707.0
    

    【讨论】:

    【解决方案3】:

    datetime.timestamp()

    假定原始日期时间实例表示本地时间,并且此方法依赖于平台 C 的 mktime() 函数来执行转换。

    所以使用它会自动应用你的机器当前时区,下面的方法是从天真的日期时间计算时间戳,不受时区的影响:

    timestamp = (dt - datetime(1970, 1, 1)) / timedelta(seconds=1)
    

    【讨论】:

    • 虽然这在其他地方也有建议,但我认为它很难阅读并且只能工作,因为datetime(1970, 1, 1) 也被视为当地时间。对我来说,这似乎是“出于错误的原因正确”。
    猜你喜欢
    • 1970-01-01
    • 2017-07-18
    • 2013-12-14
    • 2013-02-14
    • 1970-01-01
    • 1970-01-01
    • 2013-04-07
    • 1970-01-01
    • 2023-03-18
    相关资源
    最近更新 更多