Отметка времени для объекта без времени UTC Datetime дважды вычитает часы - PullRequest
0 голосов
/ 19 февраля 2019

У меня есть следующая отметка времени 1550588656, которая переводится в 2019-02-19 15:04:16+00:00 в соглашении о времени по UTC.

Я хочу преобразовать ее в соглашение о времени в моей стране (UTC или GMT -3 в это время года) поэтому он должен перевести на 2019-02-19 12:04:16+00:00

. Я прочитал другие вопросы SO, что сначала мне нужно преобразовать метку времени в объект Datetime с поддержкой 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) в результате, и я надеваюне знаю почему.

Может кто-нибудь объяснить?Моя интуиция подсказывает мне, что, вероятно, я просто не смотрю на это, но я потратил на это несколько минут и пока не смог сказать.

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

Прежде всего, у вас есть epoc time (UTC timestamp).Вам необходимо преобразовать его в объект datetime (собственный), за которым следует преобразование собственного времени в осведомленное время и, наконец, преобразование его в ваше местное время.

  1. Преобразование вашей метки времени в собственный объект даты и времени

    native_datetime = datetime.fromtimestamp(1550588656)

  2. преобразование собственный объект даты и времени в осведомленное время (добавить информацию о часовом поясе, добавит информацию о часовом поясе к собственному часовому поясу UTC для текущего )

    import pytz
    utc_time = native_datetime.replace(tzinfo=pytz.timezone("UTC"))
    
  3. локализация в курсе datetime к вашему local datetime

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

    Вы можете заменить "Америка / Сантьяго" местным часовым поясом

Думаю, это поможет вам решить вашу проблему.Спасибо!

0 голосов
/ 19 февраля 2019

Если вы посмотрите на документацию для fromtimestamp:

Верните локальные дату и время, соответствующие метке времени POSIX

Итак, проблема в том, что он уже выполняет преобразование из UTC в местное время, а вы делаете это во второй раз.

...