非 UTC 日期时间对象的时间戳两次减去小时数

Timestamp to non UTC Datetime object is substracting hours twice

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

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

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

# 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),我不知道为什么。

谁能解释一下?我的直觉告诉我,这可能是一件我没有关注的简单事情,但我已经花了一些时间在里面,但我还没能说清楚。

如果你看the documentation for fromtimestamp

Return the local date and time corresponding to the POSIX timestamp

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

首先你有 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 datetime

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

    You can replace "America/Santiago" with your local time zone

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