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

时间:2019-02-19 15:37:12

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

我有以下时间戳记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),我不知道为什么。

有人可以解释吗?我的直觉告诉我,这可能是一件简单的事情,我没看过,但是我花了几分钟,但我还没能说出来。

2 个答案:

答案 0 :(得分:2)

如果您查看the documentation for fromtimestamp

  

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

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

答案 1 :(得分:0)

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

  1. 将时间戳转换为本地日期时间对象

    native_datetime = datetime.fromtimestamp(1550588656)

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

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

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

      

    您可以将“美国/圣地亚哥” 替换为您的本地时区

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