Я имею дело с датами в Python, и мне нужно преобразовать их в метки времени UTC для использования внутри Javascript. Следующий код не работает:
>>> d = datetime.date(2011,01,01)
>>> datetime.datetime.utcfromtimestamp(time.mktime(d.timetuple()))
datetime.datetime(2010, 12, 31, 23, 0)
Преобразование объекта даты сначала в datetime также не помогает. Я попробовал пример по этой ссылке , но:
from pytz import utc, timezone
from datetime import datetime
from time import mktime
input_date = datetime(year=2011, month=1, day=15)
а теперь либо:
mktime(utc.localize(input_date).utctimetuple())
или
mktime(timezone('US/Eastern').localize(input_date).utctimetuple())
работает.
Итак, общий вопрос: как я могу преобразовать дату в секунды с начала эпохи по UTC?
datetime.date
, другой пытается преобразовать строковое представление из одного часового пояса в другой. Как человек, который ищет решение этой проблемы, я не могу сделать вывод, что последний даст ответ, который я ищу.Ответы:
Если
d = date(2011, 1, 1)
в UTC:Если
d
в местном часовом поясе:timestamp1
иtimestamp2
может отличаться, если полночь в местном часовом поясе отличается от полуночи в UTC.mktime()
может вернуть неправильный результат, еслиd
соответствует неоднозначному местному времени (например, во время перехода на летнее время) или еслиd
это прошедшая (будущая) дата, когда смещение utc могло быть другим и Cmktime()
не имеет доступа к базе данных tz на данной платформе , Вы можете использоватьpytz
модуль (например, черезtzlocal.get_localzone()
), чтобы получить доступ к базе данных tz на всех платформах . Кроме того,utcfromtimestamp()
может произойти сбой иmktime()
может вернуть временную метку, отличную от POSIX, если"right"
используется часовой пояс .Чтобы преобразовать
datetime.date
объект, который представляет дату в UTC безcalendar.timegm()
:Как я могу получить дату, конвертированную в секунды с начала эпохи по UTC?
Преобразовать
datetime.datetime
(неdatetime.date
) объект, который уже представляет время в формате UTC, в соответствующую метку времени POSIX (afloat
).Python 3.3+
datetime.timestamp()
:Примечание: необходимо указать
timezone.utc
явно, иначе.timestamp()
предположим, что ваш наивный объект datetime находится в местном часовом поясе.Python 3 (<3.3)
Из документов для
datetime.utcfromtimestamp()
:Интересное чтиво: время эпохи против времени суток на разницу между тем, который час? и сколько секунд прошло?
Смотрите также: datetime нужен метод "эпохи"
Python 2
Чтобы адаптировать приведенный выше код для Python 2:
где
timedelta.total_seconds()
эквивалентно(td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6) / 10**6
вычисленному с включенным истинным делением.пример
Остерегайтесь проблем с плавающей точкой .
Вывод
Как преобразовать осведомленный
datetime
объект в метку времени POSIXНа Python 3:
На Python 2:
источник
timestamp = (dt - datetime.fromtimestamp(0)).total_seconds()
?datetime(1970, 1, 1)
более явно.fromtimestamp()
здесь неверно (dt
в UTC, поэтомуutcfromtimestamp()
следует использовать вместо).totimestamp()
функцию в ответе.Только для систем Unix :
Примечание 1: Диззиф заметил, что это касается локализованных часовых поясов . Не используйте в производстве.
Примечание 2: Якуб Наренбский отметил, что при этом игнорируется информация о часовом поясе даже для даты и времени с учетом смещения (протестировано для Python 2.7).
источник
man strftime
в Unix-подобных системах.Предположение 1. Вы пытаетесь преобразовать дату в метку времени, однако, поскольку дата охватывает 24-часовой период, нет ни одной метки времени, которая представляет эту дату. Я предполагаю, что вы хотите представить метку времени этой даты в полночь (00: 00: 00.000).
Предположение 2. Указанная вами дата не связана с конкретным часовым поясом, однако вы хотите определить смещение от определенного часового пояса (UTC). Не зная часового пояса, в котором находится дата, невозможно рассчитать временную метку для определенного часового пояса. Я предполагаю, что вы хотите рассматривать дату, как если бы она находилась в часовом поясе локальной системы.
Во-первых, вы можете преобразовать экземпляр даты в кортеж, представляющий различные компоненты времени, используя
timetuple()
член:Затем вы можете преобразовать это в метку времени, используя
time.mktime
:Вы можете проверить этот метод, протестировав его с самим временем эпохи (1970-01-01), и в этом случае функция должна вернуть смещение часового пояса для местного часового пояса на эту дату:
28800.0
8 часов, что было бы правильно для часового пояса Тихого океана (где я нахожусь).источник
следуйте документу python2.7, вы должны использовать calendar.timegm () вместо time.mktime ()
источник
d
в UTC?Я определил свои две функции
Вот:
источник
вопрос немного запутан. метки времени не UTC - это вещь Unix. дата может быть UTC? при условии, что это так, и если вы используете Python 3.2+, simple-date делает это тривиальным:
если у вас есть год, месяц и день, вам не нужно создавать
date
:и если дата находится в каком-то другом часовом поясе (это важно, потому что мы предполагаем полночь без ассоциированного времени):
[идея, лежащая в основе simple-date, состоит в том, чтобы собрать все данные о дате и времени Python в одном согласованном классе, чтобы вы могли выполнить любое преобразование. так, например, это также пойдет другим путем:
]
источник
SimpleDate(date(2011,1,1), tz='America/New_York')
повышаетNoTimezone
, покаpytz.timezone('America/New_York')
не вызывает никаких исключений (simple-date==0.4.8
,pytz==2014.7
).pip install simple-date
, похоже, это только python3 / pip3.Используя пакет со стрелками :
источник
arrow
используетdateutil
иdateutil
знает много лет ошибки, связанные с обработкой часового пояса. Не используйте его, если вам нужны правильные результаты для часовых поясов с нефиксированным смещением UTC (можно использовать его для часового пояса UTC, но stdlib также обрабатывает случай UTC).Полная временная строка содержит:
[+HHMM or -HHMM]
Например:
1970-01-01 06:00:00 +0500
==1970-01-01 01:00:00 +0000
==UNIX timestamp:3600
Примечание:
Редактировать:
источник
1970-01-01 06:00:00 +0500
в3600
как вы просили.timezone
вpython2
, вы можете сделать расчет (06:00:00
-+0500
=01:00:00
) вручную.Учитывая, что у вас есть
datetime
вызываемый объектd
, используйте следующую команду, чтобы получить метку времени в UTC:И для противоположного направления используйте следующее:
источник
Я впечатлен глубоким обсуждением.
мои 2 цента:
с даты и времени импорта дата и время импорта
отметка времени в utc:
или,
если теперь результат из datetime.now (), в том же DST
источник