Разница между модулями Python datetime и time


137

Я пытаюсь выяснить различия между datetimeи timeмодулями, и что каждый из них должен использоваться.

Я знаю, что datetimeпредоставляет как даты, так и время. Какая польза от timeмодуля?

Примеры будут оценены, и различия, касающиеся часовых поясов, будут особенно интересны.

Ответы:


102

timeмодуль главным образом для работы с метками времени Unix; выражается в виде числа с плавающей запятой, принятого за секунды с начала эпохи Unix. datetimeмодуль может поддерживать многие из тех же операций, но обеспечивает более объектно - ориентированный набор типов, а также имеет некоторую ограниченную поддержку часовых поясов.


22
Кроме того, каковы различия между timeи datetime.time?
SparkAndShine

Было бы неплохо детализировать свойства, как если бы это было в реальном времени / однообразно. Как и в стандарте POSIX у вас есть: CLOCK_REALTIME, CLOCK_MONOTONIC, CLOCK_THREAD и т. Д ... О часах POSIX см .: stackoverflow.com/questions/3523442/…
Вайк Хермеч

12

Придерживайтесь, чтобы timeпредотвратить двусмысленность DST.

Используйте исключительно системный timeмодуль вместо datetimeмодуля, чтобы предотвратить проблемы неоднозначности с переходом на летнее время (DST) .

Преобразование в любой формат времени, включая местное, довольно просто:

import time
t = time.time()

time.strftime('%Y-%m-%d %H:%M %Z', time.localtime(t))
'2019-05-27 12:03 CEST'

time.strftime('%Y-%m-%d %H:%M %Z', time.gmtime(t))
'2019-05-27 10:03 GMT'

time.time()число с плавающей запятой, представляющее время в секундах с начала системы. time.time()идеально подходит для однозначной отметки времени.

Если система дополнительно запускает демон сетевого протокола времени (NTP) , то в итоге получается довольно прочная временная база.

Вот документация изtime модуль.


В вашем примере вы используете time.localtime(), который, конечно же, включает DST. Если мы собираемся быть пуристами, не должны ли мы использовать его time.gmtime()вместо этого? :)
Шеймус

@Seamus Простое тестирование обеих команд в ipythonпоказывает, что time.gmtime()дает кортеж, тогда как time.time()время эпохи UNIX выдается как единое десятичное значение в секундах, прошедших с 00:00:00 UTC, четверг, 1 января 1970 года. Функция time.localtime(t)преобразует время эпохи в локальное кортеж времени. Итак, ответ на ваш вопрос - «нет».
Serge Stroobandt

Есть ли способ добавить дни к объекту времени? с datetime есть метод timedelta (days = 6).
Nehemias Herrera

@NehemiasHerrera t = time.time()- это число с плавающей запятой, представляющее время в секундах с начала системной эпохи. Следовательно, можно просто добавить или вычесть 86400 секунд на каждый день; t += 86400
Серж

5

Модуль времени можно использовать, когда вам просто нужно время определенной записи - например, допустим, у вас есть отдельная таблица / файл для транзакций на каждый день, тогда вам просто нужно время. Однако тип данных time обычно используется для хранения разницы во времени. между двумя точками времени.

Это также можно сделать с помощью datetime, но если мы имеем дело только со временем для определенного дня, можно использовать модуль времени.

Datetime используется для хранения определенных данных и времени для записи. Как в агентстве по аренде. Срок выполнения будет типом данных datetime.


3

Если вас интересуют часовые пояса, вам следует рассмотреть возможность использования pytz.


8
Похоже, его больше всего интересуют модули времени и даты и времени, а также различия часовых поясов между ними. при всем уважении, привносить сюда еще одну зависимость в значительной степени неуместно.
sbartell

3
Поддержка часовых поясов в модулях time и datetime действительно очень плохая ... если он действительно заинтересован в удобной обработке часовых поясов, то ему действительно стоит знать о pytz. Вы вносите зависимости, чтобы решить проблему, в которой ваши текущие зависимости не помогают вам решить вашу проблему ...
donkopotamus
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.