Простой Python. Современный стиль программирования (Любанович) - страница 174

>tm_sec=3, tm_wday=1, tm_yday=35, tm_isdst=0)

В моем (Центральном) часовом поясе 22:31 — это то же самое, что 04:31 следующего дня в поясе UTC (раньше его называли Гринвичским временем или временем Зулу). Если вы опустите аргумент функции localtime() или gmtime(), они предположат, что сконвертировать нужно текущее время.

Их противоположностью является функция mktime(), которая преобразует объект struct_time в секунды epoch:

>>>> tm = time.localtime(now)

>>>> time.mktime(tm)

>1391488263.0

Результат не совсем похож на предыдущее значение epoch, полученное с помощью функции now(), поскольку объект struct_time сохраняет время лишь до секунд.

Небольшой совет: везде, где возможно, используйте часовой пояс UTC. UTC — это абсолютное время, не зависящее от часовых поясов. Если у вас есть сервер, установите его время согласно часовому поясу UTC, не используйте местное время.

Еще один совет (совершенно бесплатный): никогда не используйте летнее время, если можете этого избежать. Если вы используете летнее время, в одно время года час пропадет (весной вперед), а в другое — наступит дважды (осенью обратно). По каким-то причинам многие организации пользуются летним временем в своих компьютерных системах, а потом удивляются удвоению и потере данных. Заканчивается все печально.


Помните своих друзей — UTC для времени и UTF-8 для строк (о UTF-8 подробнее можно прочитать в главе 7).

Читаем и записываем дату и время

Функция Isoformat() — это не единственный способ записывать дату и время. Вы уже видели функцию ctime() в модуле time, которую можете использовать для преобразования времени epoch в строку:

>>>> import time

>>>> now = time.time()

>>>> time.ctime(now)

>'Mon Feb··3 21:14:36 2014'

Вы также можете преобразовывать дату и время с помощью функции strftime(). Она предоставляется как метод в объектах datetime, date и time objects и как функция в модуле time. strftime() использует для вывода информации на экран спецификаторы формата, которые вы можете увидеть в табл. 10.1.


Таблица 10.1. Спецификаторы вывода для strftime()
СпецификаторЕдиница даты/времениДиапазон
%YГод1900–…
%mМесяц01–12
%BНазвание месяцаЯнварь, …
%bСокращение для месяцаЯнв, …
%dДень месяца01–31
Название дняВоскресенье, …
аСокращение для дняВск, …
Часы (24 часа)00–23
%IЧасы (12 часов)01–12
%pAM или PMAM, PM
%MМинуты00–59
%SСекунды00–59

К числам слева добавляется ноль.

Рассмотрим пример работы функции strftime(), предоставленной модулем time. Она преобразует объект struct_time в строку. Сначала мы определим строку формата fmt и будем использовать ее снова в дальнейшем: