Как преобразовать объект datetime Python в секунды

извиняюсь за простой вопрос... Я новичок в Python... Я искал вокруг, и ничего не работает.

у меня есть куча объектов datetime, и я хочу вычислить количество секунд с фиксированного времени в прошлом для каждого из них (например, с 1 января 1970 года).

import datetime
t = datetime.datetime(2009, 10, 21, 0, 0)

Это, кажется, единственное различие между датами, которые имеют разные дни:

t.toordinal()

любая помощь очень ценится.

8 ответов


для специальной даты 1 января 1970 есть несколько вариантов.

для любой другой начальной даты нужно получить разницу между двумя датами в секундах. Вычитание двух дат дает timedelta объект, который по состоянию на Python 2.7 имеет


чтобы получить время Unix (секунды с 1 января 1970 года):

>>> import datetime, time
>>> t = datetime.datetime(2011, 10, 21, 0, 0)
>>> time.mktime(t.timetuple())
1319148000.0

начиная с Python 3.3 это стало очень легко с datetime.timestamp() метод. Это, конечно, будет полезно только в том случае, если вам нужно количество секунд от 1970-01-01 UTC.

from datetime import datetime
dt = datetime.today()  # Get timezone naive now
seconds = dt.timestamp()

возвращаемое значение будет поплавком, представляющим четные доли секунды. Если datetime является наивным часовым поясом (как в примере выше), предполагается, что объект datetime представляет локальное время, т. е. это будет количество секунд от текущего времени в вашем местоположении до 1970-01-01 UTC.


возможно, вне темы: чтобы получить время UNIX / POSIX из datetime и преобразовать его обратно:

>>> import datetime, time
>>> dt = datetime.datetime(2011, 10, 21, 0, 0)
>>> s = time.mktime(dt.timetuple())
>>> s
1319148000.0

# and back
>>> datetime.datetime.fromtimestamp(s)
datetime.datetime(2011, 10, 21, 0, 0)

обратите внимание, что различные часовые пояса влияют на результаты, например, мои текущие TZ/DST возвращает:

>>>  time.mktime(datetime.datetime(1970, 1, 1, 0, 0).timetuple())
-3600 # -1h

поэтому следует рассмотреть возможность нормализации в UTC с помощью UTC-версий функций.

Примечание этот предыдущий результат можно использовать для расчета смещения UTC вашего текущего часового пояса. В этом примере это +1h, то есть UTC+0100.

ссылки:


int (t.strftime("%s")) работает


из документов python:

timedelta.total_seconds()

возвращает общее количество секунд, содержащихся в длительности. Эквивалентно

(td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6) / 10**6

вычисляется с включенным истинным разделением.

обратите внимание, что для очень больших временных интервалов (более 270 лет на большинстве платформ) этот метод потеряет микросекундную точность.

эта функция является новой в версии 2.7.


я попробовал стандартную библиотеку календарь.timegm и это работает довольно хорошо:

# convert a datetime to milliseconds since Epoch
def datetime_to_utc_milliseconds(aDateTime):
    return int(calendar.timegm(aDateTime.timetuple())*1000)

Ref:https://docs.python.org/2/library/calendar.html#calendar.timegm


преобразование объекта datetime, представляющего время в формате UTC, в отметку времени POSIX:

from datetime import timezone

seconds_since_epoch = utc_time.replace(tzinfo=timezone.utc).timestamp()

чтобы преобразовать объект datetime, представляющий время в локальном часовом поясе, в метку времени POSIX:

import tzlocal # $ pip install tzlocal

local_timezone = tzlocal.get_localzone()
seconds_since_epoch = local_timezone.localize(local_time, is_dst=None).timestamp()

посмотреть Как конвертировать местное время в UTC в Python? если база данных tz доступна на данной платформе;решение только для stdlib может работать.

переходите по ссылкам, если вам нужны решения для <3.3 Python версии.