Я использую datetime.fromtimestamp
для преобразования времени эпохи в локальное время. Я обнаружил, что datetime.fromtimestamp
совершает дискретный скачок в один час в определенный момент времени, и я совершенно не понимаю, почему он это делает.Python `fromtimestamp` делает дискретный прыжок
(Я также использую time.mktime
для преобразования объекта DATETIME в эпоху времени, as suggested by Raymond Hettinger. Я не уверен, является ли соответствующая информация по этому вопросу, так что я говорю это на всякий случай.)
Python 2.7.1+ (r271:86832, Apr 11 2011, 18:05:24)
[GCC 4.5.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import time, datetime
>>> def datetime_to_epoch_time(datetime_):
... return time.mktime(datetime_.timetuple()) + datetime_.microsecond/1e6
...
Выбор конкретного времени эпохи:
>>> x = datetime_to_epoch_time(datetime.datetime(2012, 3, 30, 3, 0))
Преобразование его в DateTime с помощью fromtimestamp
:
>>> datetime.datetime.fromtimestamp(x)
datetime.datetime(2012, 3, 30, 3, 0)
Мы получаем время 3 утра.
Теперь давайте преобразуем время это именно одна вторая перед ним:
>>> datetime.datetime.fromtimestamp(x-1)
datetime.datetime(2012, 3, 30, 1, 59, 59)
Мы вдруг получить 1:59 утра!
Что случилось? Я знаю, что такие вещи случаются в високосный день, но с каких пор 30 марта високосный день?
Я должен отметить, что это произошло со мной только в Linux, а не в Windows. И я думаю, что разные компьютеры Linux (в разных часовых поясах) имеют разную точку времени, в которой fromtimestamp
выполняет скачок.
Я вижу. Поэтому 'fromtimestamp' знает о часовом поясе, в котором я живу, и знает, какие часы пропускать. Но объекты 'datetime' не знают об этом прыжке: если я вычитаю объект' datetime' за 3 часа из одного за 2am, я получаю «timedelta» одного часа, где я должен получать нуль. –
Как же я делаю объекты 'datetime' осведомленными о моем часовом поясе и заставляю их использовать * точный * некоторый часовой пояс как' fromtimestamp', так что они будут полностью синхронизированы? –
@RamRachum При создании метки времени передайте флаг 'tzinfo'. библиотека 'pytz' может помочь в этом. – Amber