Как узнать текущее время в Python?
Модуль time
Модуль time
предоставляет функции, которые сообщают нам время в «секундах с начала эпохи», а также другие утилиты.
import time
Время эпохи Unix
Это формат, в котором вы должны получать временные метки для сохранения в базах данных. Это простое число с плавающей запятой, которое можно преобразовать в целое число. Это также хорошо для арифметики в секундах, так как представляет количество секунд с 1 января 1970 года 00:00:00, и это свет памяти относительно других представлений времени, на которые мы будем смотреть далее:
>>> time.time()
1424233311.771502
Эта временная метка не учитывает високосных секунд, поэтому она не линейна - високосные секунды игнорируются. Таким образом, хотя он не эквивалентен международному стандарту UTC, он близок, и, следовательно, довольно хорош для большинства случаев ведения учета.
Однако это не идеально для планирования человека. Если у вас есть будущее событие, которое вы хотите провести в определенный момент времени, вам нужно сохранить это время со строкой, которую можно проанализировать в объекте datetime или сериализованном объекте datetime (они будут описаны позже).
time.ctime
Вы также можете представлять текущее время так, как предпочитает ваша операционная система (что означает, что оно может меняться при изменении системных настроек, поэтому не полагайтесь, что оно будет стандартным для всех систем, как я видел) другие ожидают). Обычно это удобно для пользователя, но обычно не приводит к строкам, которые можно сортировать в хронологическом порядке:
>>> time.ctime()
'Tue Feb 17 23:21:56 2015'
Вы также можете перевести метки времени в удобочитаемую форму с помощью ctime
:
>>> time.ctime(1424233311.771502)
'Tue Feb 17 23:21:51 2015'
Это преобразование также не подходит для ведения записей (за исключением текста, который будет анализироваться только людьми - и с улучшенным оптическим распознаванием символов и искусственным интеллектом, я думаю, число этих случаев уменьшится).
datetime
модуль
Модуль datetime
также весьма полезен здесь:
>>> import datetime
datetime.datetime.now
datetime.now
- это метод класса, который возвращает текущее время. Он использует time.localtime
без информации о часовом поясе (если не указан, в противном случае смотрите информацию о часовом поясе ниже). Он имеет представление (которое позволит вам воссоздать эквивалентный объект), отраженное в оболочке, но при печати (или приведении к str
) оно имеет читаемый человеком формат (и почти ISO), и лексикографическая сортировка эквивалент хронологического вида:
>>> datetime.datetime.now()
datetime.datetime(2015, 2, 17, 23, 43, 49, 94252)
>>> print(datetime.datetime.now())
2015-02-17 23:43:51.782461
datetime's utcnow
Вы можете получить объект datetime в глобальном стандарте времени UTC, выполнив следующее:
>>> datetime.datetime.utcnow()
datetime.datetime(2015, 2, 18, 4, 53, 28, 394163)
>>> print(datetime.datetime.utcnow())
2015-02-18 04:53:31.783988
UTC - это стандарт времени, который почти эквивалентен часовому поясу GMT. (Хотя GMT и UTC не меняются на летнее время, их пользователи могут переключаться на другие часовые пояса, такие как британское летнее время, в течение лета.)
дата / время и часовой пояс
Однако ни один из созданных нами объектов даты и времени не может быть легко преобразован в различные часовые пояса. Мы можем решить эту проблему с помощью модуля pytz
:
>>> import pytz
>>> then = datetime.datetime.now(pytz.utc)
>>> then
datetime.datetime(2015, 2, 18, 4, 55, 58, 753949, tzinfo=<UTC>)
Эквивалентно, в Python 3 у нас есть класс timezone
с присоединенным экземпляром utc timezone
, который также делает объект часовой пояс осведомленным (но преобразование в другой часовой пояс без удобного модуля pytz
оставлено в качестве упражнения читателю):
>>> datetime.datetime.now(datetime.timezone.utc)
datetime.datetime(2015, 2, 18, 22, 31, 56, 564191, tzinfo=datetime.timezone.utc)
И мы видим, что можем легко преобразовать часовые пояса из исходного объекта utc.
>>> print(then)
2015-02-18 04:55:58.753949+00:00
>>> print(then.astimezone(pytz.timezone('US/Eastern')))
2015-02-17 23:55:58.753949-05:00
Вы также можете сделать наивный объект datetime осведомленным с помощью метода pytz
timezone localize
или путем замены атрибута tzinfo (на replace
, это делается вслепую), но это более поздние меры, чем лучшие практики :
>>> pytz.utc.localize(datetime.datetime.utcnow())
datetime.datetime(2015, 2, 18, 6, 6, 29, 32285, tzinfo=<UTC>)
>>> datetime.datetime.utcnow().replace(tzinfo=pytz.utc)
datetime.datetime(2015, 2, 18, 6, 9, 30, 728550, tzinfo=<UTC>)
Модуль pytz
позволяет нам сообщать о часовом поясе объектов datetime
и преобразовывать время в сотни часовых поясов, доступных в модуле pytz
.
Можно было бы якобы сериализовать этот объект для времени UTC и сохранить , что в базе данных, но это потребовало бы гораздо больше памяти и было бы более подвержено ошибкам, чем простое сохранение времени эпохи Unix, которое я продемонстрировал первым ,
Другие способы просмотра времени гораздо более подвержены ошибкам, особенно при работе с данными, которые могут поступать из разных часовых поясов. Вы хотите, чтобы не было путаницы относительно того, для какого часового пояса была предназначена строка или сериализованный объект datetime.
Если вы отображаете время с Python для пользователя, ctime
работает хорошо, не в таблице (обычно не очень хорошо сортируется), но, возможно, в часах. Однако я лично рекомендую при работе со временем в Python использовать Unix time или объект UTC datetime
с поддержкой часовых поясов.