Модуль datetime в Python: как работать с датой и временем
ссылка на оригинальную статью автора @python2day

Для работы с датой и временем в Python 2 и 3 есть отдельный модуль datetime
. В отличие от других языков, таких как SQL, в Python нет встроенного типа данных для работы с датой и временем - это достигается путем импорта модуля и созданием объекта. Модуль datetime
входит в пакет Python и его не нужно отдельно устанавливать.
Импорт модуля осуществляется следующим путем: import datetime
Содержание поста
- Получение текущей даты и времени
- Форматирование и перевод в строку
- Получения дня недели и название месяца
- Создание объекта даты и времени
- Создание из строк
- Продолжительность времени с timedelta
- Разница между датами
- Изменение объектов
- Сравнение и условия
- Работа с метками (штампами) timestamp
- Работа с часовыми поясами и tzinfo
Получение текущей даты и времени
Для вывода даты и времени нужно выполнить следующее:

Как видно мы получаем для создания объекта даты и времени используется класс с тем же именем что и модуль datetime
.
Когда нужно получить только дату используется класс date:

Получение только времени выполняется через метод time():

Каждый из описываемых классов можно импортировать следующим способом:

Форматирование и перевод в строку
Для получение части даты или времени можно использовать следующие атрибуты:
- year
- month
- day
- weekday
- hour
- minute
- secondimport datetime # Получение дня от даты

Так же есть метод strftime
, который форматирует даты в нужном формате в строку. Например так мы получим дату в формате, который используется у нас:

Где:
- %d - день месяца с 1 по 31;
- %m - месяц с 1 по 12;
- %Y - год;
- %H - час в формате 0-24;
- %M - минуты;
- %S - секунды.
Таким же способом можно получить время и дату:
- %c - время и дата;
- %x - дата;
- %X - время.

Обратите внимание, что таким способом мы преобразуем объект класса datetime
в строку и мы больше не сможем использовать методы по работе с датой (например сравнение):

Мы получим ошибку так как уже работаем со строкой:
- AttributeError: 'str' object has no attribute 'day'
Выше описаны основные возможности форматирования используя метод strftime()
, но их, конечно, больше.
Получения дня недели и название месяца
Можно получить название дня недели или название. Численный вариант эквивалентен следующим значениям:
- 0 - Monday (Понедельник);
- 1 - Tuesday (Вторник);
- 2 - Wednesday (Среда);
- 3 - Thursday (Четверг);
- 4 - Friday (Пятница);
- 5 - Saturday (Суббота);
- 6 - Sunday (Воскресенье).
Следующий пример вернет день недели в виде числа:

Или получить название:

Где:
- %A - полное название дня недели;
- %a - сокращенное название дня недели;
- %s - представление в виде числа.
Такой же принцип по работе с месяцами, где:
- %B - полное название месяца;
- %b - сокращенное название месяца;
- %m - месяц в виде числа.
Создание объекта даты и времени
Для создания даты используется класс с аргументами date(год, месяц, число)
:

Можно создать дату и время. В обоих случаях мы можем использовать именованные аргументы если так удобнее:

Каждый аргумент времени, по умолчанию, имеет значение 0. Мы так же можем использовать подход выше для получения, например, только года или времени:

Если вы не укажете год, месяц или день, то получите ошибку т.к. они по умолчанию равны None
:
- TypeError: Required argument 'year' (pos 1) not found
Есть отдельный класс для создания времени time:

Создание из строк
Используя strptime()
можно создавать объект datetime
из строки:

Продолжительность времени с timedelta
timedelta
- это класс с помощью которого можно установить не дату, как в примерах выше, а продолжительность. Так мы создадим объект с 12 днями и 33 секундами:

Все атрибуты, которые мы можем указывать для этого класса:
- days
- seconds
- microseconds
- milliseconds
- minutes
- hours
Кроме этого мы можем преобразовывать эти объекты в секунды:

Разница между датами
Мы можем искать разницу между датами получая объект timedelta
:

Изменение объектов
Каждый их объектов выше можно изменить. Так мы изменим объект timedelta
прибавив часы к минутам:

С помощью timedelta
изменяется и дата. Пример ниже изменяет текущую дату прибавляя к ней 1 день и 1 час:

Сравнение и условия
Каких либо хитростей в сравнении объектов нет. В следующем примере идет сравнение двух дат с разницей в день:

При этом стоит проверять, что объекты относятся к классу datetime
, а не являются строками. В следующем примере мы сравниваем года, но они уже относятся к численным:

Объект timedelta
тоже можно сравнивать:

Работа с метками (штампами) timestamp
При работе с API или в Unix системах мы можем увидеть отображение времени в таком формате:1578238360
Данные числа обозначают количество секунд с 1 января 1970 года. Мы можем конвертировать данное число в понятный формат используя datetime
:

Так же сработает если мы хотим получить и время:

Для конвертирования в timestamp
используется метод с аналогичным названием:

Работа с часовыми поясами
К сожалению у меня нет большого опыта работы с часовыми поясами и примеры ниже не стоит рассматривать как лучшие практики.
Библиотека datetime
не хранит часовые пояса, данные о переводах часов (летнее и зимнее время) и високосных секундах. К тому же, некоторые страны, могут изменить время опираясь на локальные ситуации. Эти ситуации опасны, когда идет запись в базу данных. Для вывода в GUI, можно использовать datetime.datetime.now()
или высчитывать часовой пояс из базы.
Для записи в базу данных мы можем использовать время UTC и отдельно считать часовой пояс:

Следующий пример вычислит разницу времени между UTC и локальным. Насколько я знаю он может не сработать на версиях Python < 3.3:

Для вычисления других часовых поясов можно использовать стороннюю библиотеку pytz, которая их хранит: pip install pytz
Вывести все часовые пояса мы можем так:
