Преобразование даты и времени python в timestamp и обратно в UTC по-прежнему использует локальный часовой пояс
Я работаю с кодом, который дает мне временные метки utc, и я хочу преобразовать их в соответствующие даты. К сожалению, когда я тестирую простые случаи с pytz, время datetime имеет добавленные 6 часов (смещение CST к UTC). Мне нужно сохранить правильные данные часового пояса, потому что я вычисляю разницу между другими часовыми поясами. Любые идеи, почему и как преобразовать временную метку utc в datetime 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)
Ответы
Ответ 1
Хмм я нашел ответ здесь: Как указать часовой пояс (UTC) при конвертации в Unix-время? (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>)
Ответ 2
Чтобы получить наивный объект datetime, который представляет время в формате UTC с отметки времени "секунды с момента":
from datetime import datetime
utc_dt = datetime.utcfromtimestamp(ts)
Если вы хотите получить доступный объект datetime для часовой пояс UTC:
import pytz
aware_utc_dt = utc_dt.replace(tzinfo=pytz.utc)
Чтобы преобразовать его в другой часовой пояс:
tz = pytz.timezone('America/Montreal')
dt = aware_utc_dt.astimezone(tz)
Чтобы мгновенно преобразовать метку времени в известный объект datetime в данный часовой пояс:
dt = datetime.fromtimestamp(ts, tz)
Ответ 3
Возможно, вы находитесь в часовом поясе США или эквиваленте США?
Похоже, он показывает, какое время было в UTC, когда ваше местное время было полночь 1/1/2007.