Итак, общий вопрос: как я могу преобразовать дату в секунды с момента начала эпохи в соответствии с UTC?
Переведено автоматически
Ответ 1
Если d = date(2011, 1, 1) находится в UTC:
>>> from datetime import datetime, date >>> import calendar >>> timestamp1 = calendar.timegm(d.timetuple()) >>> datetime.utcfromtimestamp(timestamp1) datetime.datetime(2011, 1, 1, 0, 0)
Если d находится в местном часовом поясе:
>>> import time >>> timestamp2 = time.mktime(d.timetuple()) # DO NOT USE IT WITH UTC DATE >>> datetime.fromtimestamp(timestamp2) datetime.datetime(2011, 1, 1, 0, 0)
timestamp1 и timestamp2 может отличаться, если полночь в местном часовом поясе не совпадает с полуночью по UTC.
Для преобразования datetime.date объекта, представляющего дату в UTC без calendar.timegm():
DAY = 24*60*60# POSIX day in seconds (exact value) timestamp = (utc_date.toordinal() - date(1970, 1, 1).toordinal()) * DAY timestamp = (utc_date - date(1970, 1, 1)).days * DAY
Как я могу преобразовать дату в секунды с момента начала эпохи в соответствии с UTC?
Для преобразования datetime.datetime (не datetime.date) объекта, который уже представляет время в UTC, в соответствующую временную метку POSIX (a float).
Не существует метода для получения временной метки из экземпляра datetime, но временную метку POSIX, соответствующую dt экземпляра datetime, можно легко вычислить следующим образом. Для наивного dt:
# utc time = local time - utc offset utc_naive = dt.replace(tzinfo=None) - dt.utcoffset() timestamp = (utc_naive - datetime(1970, 1, 1)).total_seconds()
Ответ 2
Только для систем Unix:
>>> import datetime >>> d = datetime.date(2011, 1, 1) >>> d.strftime("%s") # <-- THIS IS THE CODE YOU WANT '1293832800'
Примечание 1: dizzyf заметил, что это применяет локализованные часовые пояса. Не использовать в производстве.
Примечание 2: Якуб Нарембски отметил, что это игнорирует информацию о часовом поясе даже для datetime с учетом смещения (протестировано для Python 2.7).
Ответ 3
Предположение 1: Вы пытаетесь преобразовать дату во временную метку, однако, поскольку дата охватывает 24-часовой период, нет ни одной временной метки, которая представляла бы эту дату. Я предположу, что вы хотите представить временную метку этой даты в полночь (00:00:00.000).
Предположение 2: указанная вами дата не связана с определенным часовым поясом, однако вы хотите определить смещение от определенного часового пояса (UTC). Не зная часового пояса, в котором находится дата, невозможно вычислить временную метку для определенного часового пояса. Я предположу, что вы хотите обрабатывать дату так, как если бы она находилась в часовом поясе локальной системы.
Во-первых, вы можете преобразовать экземпляр date в кортеж, представляющий различные компоненты времени, используя член timetuple():
Затем вы можете преобразовать это во временную метку с помощью time.mktime:
ts = time.mktime(dtt) # 1293868800.0
Вы можете проверить этот метод, протестировав его с самим временем эпохи (1970-01-01), и в этом случае функция должна вернуть смещение часового пояса для местного часового пояса на эту дату:
28800.0 составляет 8 часов, что было бы правильно для тихоокеанского часового пояса (где я нахожусь).
Ответ 4
Я определил свои собственные две функции
utc_time2datetime(utc_time, tz= Нет)
datetime2utc_time(дата-время)
здесь:
import time import datetime from pytz import timezone import calendar import pytz
defutc_time2datetime(utc_time, tz=None): # convert utc time to utc datetime utc_datetime = datetime.datetime.fromtimestamp(utc_time)
# add time zone to utc datetime if tz isNone: tz_datetime = utc_datetime.astimezone(timezone('utc')) else: tz_datetime = utc_datetime.astimezone(tz)
return tz_datetime
defdatetime2utc_time(datetime): # add utc time zone if no time zone is set if datetime.tzinfo isNone: datetime = datetime.replace(tzinfo=timezone('utc'))
# convert to utc time zone from whatever time zone the datetime is set to utc_datetime = datetime.astimezone(timezone('utc')).replace(tzinfo=None)
# create a time tuple from datetime utc_timetuple = utc_datetime.timetuple()
# create a time element from the tuple an add microseconds utc_time = calendar.timegm(utc_timetuple) + datetime.microsecond / 1E6