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

Модуль datetime в Python: как работать с датой и временем
Photo by Lukas Blazek / Unsplash

ссылка на оригинальную статью автора @python2day

Работа с датой и временем в модуле Python datetime

Для работы с датой и временем в Python 2 и 3 есть отдельный модуль datetime. В отличие от других языков, таких как SQL, в Python нет встроенного типа данных для работы с датой и временем - это достигается путем импорта модуля и созданием объекта. Модуль datetime входит в пакет Python и его не нужно отдельно устанавливать.

Импорт модуля осуществляется следующим путем: import datetime

Содержание поста

  • Получение текущей даты и времени
  • Форматирование и перевод в строку
  • Получения дня недели и название месяца
  • Создание объекта даты и времени
  • Создание из строк
  • Продолжительность времени с timedelta
  • Разница между датами
  • Изменение объектов
  • Сравнение и условия
  • Работа с метками (штампами) timestamp
  • Работа с часовыми поясами и tzinfo

Получение текущей даты и времени

Для вывода даты и времени нужно выполнить следующее:

Получение текущей даты и времени в Python datetime


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

Когда нужно получить только дату используется класс date:

Получение текущей даты в Python datetime


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

Получение времени в Python datetime


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

Импорт модуля datetime в Python


Форматирование и перевод в строку

Для получение части даты или времени можно использовать следующие атрибуты:

  • year
  • month
  • day
  • weekday
  • hour
  • minute
  • secondimport datetime # Получение дня от даты
Форматирование строки с датой в Python datetime


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

Форматирование в datetime Python


Где:

  • %d - день месяца с 1 по 31;
  • %m - месяц с 1 по 12;
  • %Y - год;
  • %H - час в формате 0-24;
  • %M - минуты;
  • %S - секунды.

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

  • %c - время и дата;
  • %x - дата;
  • %X - время.
Форматирование в datetime Python


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

Типы дат в datetime Python


Мы получим ошибку так как уже работаем со строкой:

  • AttributeError: 'str' object has no attribute 'day'

Выше описаны основные возможности форматирования используя метод strftime(), но их, конечно, больше.

Получения дня недели и название месяца

Можно получить название дня недели или название. Численный вариант эквивалентен следующим значениям:

  • 0 - Monday (Понедельник);
  • 1 - Tuesday (Вторник);
  • 2 - Wednesday (Среда);
  • 3 - Thursday (Четверг);
  • 4 - Friday (Пятница);
  • 5 - Saturday (Суббота);
  • 6 - Sunday (Воскресенье).

Следующий пример вернет день недели в виде числа:

Получение дня недели в Python datetime


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

Получение имени дня недели в Python datetime


Где:

  • %A - полное название дня недели;
  • %a - сокращенное название дня недели;
  • %s - представление в виде числа.

Такой же принцип по работе с месяцами, где:

  • %B - полное название месяца;
  • %b - сокращенное название месяца;
  • %m - месяц в виде числа.

Создание объекта даты и времени

Для создания даты используется класс с аргументами date(год, месяц, число):

Создание объекта с даты в Python datetime


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

Создание объекта с датой и временем в Python datetime

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

Именованные аргумента в datetime Python


Если вы не укажете год, месяц или день, то получите ошибку т.к. они по умолчанию равны None:

  • TypeError: Required argument 'year' (pos 1) not found

Есть отдельный класс для создания времени time:

Создание объекта времени в datetime Python


Создание из строк

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

Создание даты из строки с datetime strptime Python


Продолжительность времени с timedelta

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

Продолжительность с timedelta в Python datetime


Все атрибуты, которые мы можем указывать для этого класса:

  • days
  • seconds
  • microseconds
  • milliseconds
  • minutes
  • hours

Кроме этого мы можем преобразовывать эти объекты в секунды:

Получение секунд в datetime Python


Разница между датами

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

Разница между датами в Python datetime


Изменение объектов

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

Изменение времени в Python datetime


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

Добавление дней в Python datetime

Сравнение и условия

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

Сравнение объектов datetime в Python


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

Сравнение годов в Python datetime


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

Сравнение timedelta в Python datetime

Работа с метками (штампами) timestamp

При работе с API или в Unix системах мы можем увидеть отображение времени в таком формате:1578238360

Данные числа обозначают количество секунд с 1 января 1970 года. Мы можем конвертировать данное число в понятный формат используя datetime:

Работа с UNIX timestamp Python datetime


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

Получение даты и времени из timestamp в Python datetime


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

Создание timestamp в Python datetime


Работа с часовыми поясами

К сожалению у меня нет большого опыта работы с часовыми поясами и примеры ниже не стоит рассматривать как лучшие практики.

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

Для записи в базу данных мы можем использовать время UTC и отдельно считать часовой пояс:

Время UTC в Python Datetime


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

Разница во времени UTC Python datetime


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

Вывести все часовые пояса мы можем так:

Вывод всех часовых поясов в Python pytz