【问题标题】:Converting python datetime to timestamp and back in UTC still uses local timezone将 python 日期时间转换为时间戳并返回 UTC 仍使用本地时区
【发布时间】:2011-08-22 20:01:02
【问题描述】:

我正在使用提供 utc 时间戳的代码,我想将它们转换为适当的日期时间。不幸的是,当我使用 pytz 测试简单案例时,日期时间增加了 6 小时(CST 与 UTC 的偏移量)。我需要保持时区数据正确,因为我也在计算其他时区之间的差异。任何想法为什么以及如何将 utc 时间戳转换为 utc 日期时间?

In [1]: import pytz

In [2]: from datetime import datetime

In [3]: import time

In [4]: datetime.fromtimestamp(time.mktime(datetime(7,1,1, tzinfo=pytz.UTC).timetuple()), tz=pytz.UTC)
Out[4]: datetime.datetime(2007, 1, 1, 6, 0, tzinfo=<UTC>)

In [5]: datetime.fromtimestamp(time.mktime(datetime(7,1,1).utctimetuple()), tz=pytz.UTC)
Out[5]: datetime.datetime(2007, 1, 1, 6, 0, tzinfo=<UTC>)

In [6]: datetime.fromtimestamp(time.mktime(datetime(7,1,1).utctimetuple()))
Out[6]: datetime.datetime(2007, 1, 1, 0, 0)

【问题讨论】:

标签: python datetime time pytz


【解决方案1】:

从“自纪元以来的秒数”时间戳获取一个以 UTC 表示时间的简单日期时间对象:

from datetime import datetime

utc_dt = datetime.utcfromtimestamp(ts)

如果您想获取 UTC 时区的感知日期时间对象:

import pytz

aware_utc_dt = utc_dt.replace(tzinfo=pytz.utc)

要将其转换为其他时区:

tz = pytz.timezone('America/Montreal')
dt = aware_utc_dt.astimezone(tz)

直接将时间戳转换为给定时区中的感知日期时间对象:

dt = datetime.fromtimestamp(ts, tz)

【讨论】:

  • 变量ts是什么?
  • @Curious 该方法的名称中有单词:“来自时间戳”。它表明该参数是一个时间戳。代码前的文字描述也暗示了这一点。把它写成 'utc_dt = datetime.utcfromtimestamp(timestamp)` 我认为会过分,所以我将 timestamp 缩写为 ts
【解决方案2】:

嗯,我在这里找到了答案:How to specify time zone (UTC) when converting to Unix time? (Python)

In [101]: ts = calendar.timegm(datetime(2010, 7, 1, tzinfo=pytz.utc).timetuple())

In [102]: datetime.fromtimestamp(ts, tz=pytz.utc)
Out[102]: datetime.datetime(2010, 7, 1, 0, 0, tzinfo=<UTC>)

【讨论】:

    猜你喜欢
    • 2019-03-09
    • 2016-08-06
    • 2019-01-05
    • 2019-08-15
    • 2021-06-14
    • 2012-10-07
    • 1970-01-01
    • 2014-08-23
    • 2015-04-20
    相关资源
    最近更新 更多