【问题标题】:Timestamp to non UTC Datetime object is substracting hours twice非 UTC 日期时间对象的时间戳两次减去小时
【发布时间】:2019-02-19 15:37:11
【问题描述】:

我有以下时间戳 1550588656 在 UTC 时间约定中转换为 2019-02-19 15:04:16+00:00

我想将其转换为我所在国家/地区的时间约定(一年中这个时候的 UTC 或 GMT -3),因此它应该转换为 2019-02-19 12:04:16+00:00

我已阅读其他 SO 问题,首先我必须将时间戳转换为可感知 UTC 的 Datetime 对象然后对其进行本地化,我正在这样做

# string format time
naive_datetime = datetime.fromtimestamp(timestamp).strftime('%Y-%m-%d %H:%M:%S')

# string parse time
naive_datetime = datetime.strptime(naive_datetime, "%Y-%m-%d %H:%M:%S")

# make naive Datetime object UTC aware
utc_datetime = naive_datetime.replace(tzinfo=pytz.UTC)

所以现在它不是一个简单的 Datetime 对象,从这里我应该能够将它本地化到我所在国家的时区。在 Python 中是 pytz.timezone('America/Santiago')

所以应该是这样的

cltime = pytz.timezone('America/Santiago')
local_datetime = utc_datetime.astimezone(cltime)

但是结果我得到了2019-02-19 09:04:16-03:00(UTC 或 GTM -6),我不知道为什么。

谁能解释一下?我的直觉告诉我,这可能是一件简单的事情,我并没有在看,但我已经花了几分钟时间,但我还不能说出来。

【问题讨论】:

  • 当我做同样的事情时,我得到datetime.datetime(2019, 2, 19, 12, 4, 16, tzinfo=<DstTzInfo 'America/Santiago' -03-1 day, 21:00:00 DST>)。这真的是你的代码吗?
  • 是,here的图片
  • 在您的第二段中,它转换为2019-02-19 12:04:16-03:00。您错误地将偏移量指定为+00:00

标签: python python-2.7 datetime timezone unix-timestamp


【解决方案1】:

如果你看the documentation for fromtimestamp

返回 POSIX 时间戳对应的本地日期和时间

所以问题是它已经在进行从 UTC 到本地时间的转换,而您正在第二次进行。

【讨论】:

  • 嗯,就是这样。我想这就是我从其他答案中盲目复制和粘贴的结果。奇怪的是,如果您打印生成的 Datetime 的时区信息(就在 fromtimestamp 调用之后),它会显示 None,显然情况并非如此。还是谢谢你,你解决了!
  • @mfdebian tzinfo=None 意思是“我不知道”,这意味着您需要查看文档才能弄清楚真相。传统上,datetime 不提供自己的时区对象,因为它们可能会发生变化,因此支持有点差。
  • 感谢您的澄清标记! (另外,漂亮的个人资料图片)。
【解决方案2】:

首先,您有 epoc 时间(UTC 时间戳)。您需要将其转换为日期时间对象(本机),然后将本机时间转换为感知时间,最后将其转换为您的本地时间。

  1. 将您的时间戳转换为本机日期时间对象

    native_datetime = datetime.fromtimestamp(1550588656)

  2. native 日期时间对象转换为 aware 时间(添加时区信息,会将时区信息添加到当前的本地时区 UTC

    import pytz
    utc_time = native_datetime.replace(tzinfo=pytz.timezone("UTC"))
    
  3. aware 日期时间本地化为您的 本地 日期时间

    local_time = utc_time.astimezone(pytz.timezone("America/Santiago"))

    您可以将 "America/Santiago" 替换为您当地的时区

我认为这将帮助您解决问题。谢谢!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-26
    • 2020-08-23
    相关资源
    最近更新 更多