Извиняюсь за простой вопрос ... Я новичок в Python ... Я искал вокруг, и, кажется, ничего не работает.
У меня есть куча объектов datetime, и я хочу рассчитать количество секунд с фиксированного времени в прошлом для каждого из них (например, с 1 января 1970 года).
import datetime
t = datetime.datetime(2009, 10, 21, 0, 0)
Кажется, это только различие между датами, у которых есть разные дни:
t.toordinal()
Любая помощь очень ценится.
python
python-2.7
Натан Липпи
источник
источник
datetime.date
в UTC отметка времени в Pythonint(t.timestamp())
Ответы:
Для особой даты 1 января 1970 года есть несколько вариантов.
Для любой другой даты начала вам нужно получить разницу между двумя датами в секундах. Вычитание двух дат дает
timedelta
объект, который с Python 2.7 имеетtotal_seconds()
функцию.Дата начала обычно указывается в UTC, поэтому для получения правильных результатов
datetime
вы должны указать эту формулу в UTC. Если выdatetime
еще не в UTC, вам необходимо преобразовать его перед использованием или прикрепитьtzinfo
класс с соответствующим смещением.Как отмечено в комментариях, если у вас есть
tzinfo
прикрепленное к вашему,datetime
то оно вам понадобится и на дату начала, иначе вычитание не удастся; для приведенного выше примера я бы добавил,tzinfo=pytz.utc
если вы используете Python 2 илиtzinfo=timezone.utc
Python 3.источник
datetime.datetime(1970,1,1,tzinfo=pytz.utc)
.datetime.datetime.utcfromtimestamp(0)
я использовал это, чтобы легко получить «эпоху». Обратите внимание, что эпоха не всегда одинакова на всех системах.time.time()
иdatetime.now() - datetime(1970, 1, 1)
отличаются на 7200 секунд. Скорее используйте(t - datetime.datetime.fromtimestamp(0)).total_seconds()
. Вы не использовать ,utcfromtimestamp(0)
если вы хотите , чтобы преобразовать DateTime в локальном часовом поясе.Чтобы узнать время Unix (секунды с 1 января 1970 года):
источник
t
это местное время. Смещение UTC для местного часового пояса в прошлом могло быть другим, и еслиmktime()
(библиотека C) не имеет доступа к историческим данным часового пояса на данной платформе, это может привести к сбою (pytz
это переносной способ доступа к базе данных tz). Кроме того, местное время может быть неоднозначным, например, во время переходов DST - вам нужна дополнительная информация для устранения неоднозначности, например, если вы знаете, что последовательные значения даты / времени должны увеличиваться в файле журналаtime.mktime(datetime.datetime(2019, 8, 3, 4, 5, 6, 912000).timetuple())
приводит к1564819506.0
тихому отбрасыванию миллисекунд, ноdatetime.datetime(2019, 8, 3, 4, 5, 6, 912000).timestamp()
(ответ Анджея Пронобиса) приводит1564819506.912
к ожидаемому результату.Начиная с Python 3.3 это становится очень легко с этим
datetime.timestamp()
методом. Это, конечно, будет полезно, только если вам нужно количество секунд с 1970-01-01 UTC.Возвращаемым значением будет число с плавающей точкой, представляющее четные доли секунды. Если datetime является часовым поясом наивным (как в примере выше), предполагается, что объект datetime представляет местное время, т.е. это будет количество секунд с текущего времени в вашем местоположении до 1970-01-01 UTC.
источник
Может быть, не по теме: получить UNIX / POSIX время от datetime и преобразовать его обратно:
Обратите внимание, что различные часовые пояса влияют на результаты, например, мои текущие значения TZ / DST:
поэтому следует рассмотреть возможность нормализации к UTC с использованием версий функций UTC.
Обратите внимание, что предыдущий результат может быть использован для расчета смещения UTC вашего текущего часового пояса. В этом примере это + 1 час, то есть UTC + 0100.
Ссылки:
источник
mktime()
может потерпеть неудачу . В общем, вам нужноpytz
преобразовать местное время в utc, чтобы получить метку времени POSIX.int (t.strftime("%s"))
также работаетисточник
import datetime; t = datetime.datetime(2011, 10, 21, 0, 0)
(как указано OP). Но на самом деле, я сомневаюсь, что% s - это недавно добавленный формат времени.%s
не поддерживается (это может работать на некоторых платформах, еслиt
это простой объект datetime, представляющий местное время, и если локальная библиотека C имеет доступ к базе данных tz, в противном случае результат может быть неправильным). Не используйте это.%s
нигде не документировано. Я посеял это в реальном коде, и мне было интересно, что это такое, и посмотрите в документации, а такой вещи нет%s
. Есть только с большим S только на секунды.из документации по питону:
Возвращает общее количество секунд, содержащихся в продолжительности. Эквивалентно
вычисляется с включенным истинным делением.
Обратите внимание, что для очень больших временных интервалов (более 270 лет на большинстве платформ) этот метод теряет микросекундную точность.
Эта функциональность является новой в версии 2.7.
источник
Чтобы преобразовать объект datetime, который представляет время в формате UTC, в метку времени POSIX :
Чтобы преобразовать объект datetime, представляющий время в местном часовом поясе, в метку времени POSIX:
См. Как мне конвертировать местное время в UTC в Python? Если база данных tz доступна на данной платформе; может работать только решение stdlib .
Перейдите по ссылкам, если вам нужны решения для
<3.3
версий Python.источник
Я попробовал календарь calendar.timegm в стандартной библиотеке, и он работает довольно хорошо:
Ссылка: https://docs.python.org/2/library/calendar.html#calendar.timegm
источник
aDateTime
это время UTC