Datetime в Python - работа со временем и датой


05 января 2020


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

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

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

import datetime

 

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

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

import datetime
day_time = datetime.datetime.now()
print(day_time)

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

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

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

import datetime
day = datetime.date.today()
print(day)

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

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

import datetime
date_time = datetime.datetime.now().time()
print(date_time, type(date_time))

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

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

from datetime import date
from datetime import datetime
print(datetime.now())
print(date.today())

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

 

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

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

  • year
  • month
  • day
  • weekday
  • hour
  • minute
  • second
import datetime
# Получение дня от даты
date = datetime.date.today()
print(date.day)
date_time = datetime.datetime.now()
# Получение часа суток от времени
print(date_time.hour)

Форматирование строки с датой в Python datetime

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

import datetime
date = datetime.datetime.today()
print(date.strftime('%d-%m-%Y %H:%M'))

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

Где:

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

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

  • %c - время и дата;
  • %x - дата;
  • %X - время.
date = datetime.datetime.today()
print(date.strftime('%x'))

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

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

import datetime
date = datetime.datetime.today()
local_date = date.strftime('%d-%m-%Y %H:%M')
print('Объект класса datetime: ', type(date))
print('Дата преобразованная в строку: ', type(local_date))
print(local_date.day)

Типы дат в datetime Python

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

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

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

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

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

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

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

date = datetime.datetime.today()
print(date.weekday())

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

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

date = datetime.datetime.today()
print(date.strftime('%A'))
print(date.strftime('%a'))

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

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

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

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

 

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

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

date = datetime.date(2019, 1, 13)
print(date, type(date))

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

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

date_time = datetime.datetime(year = 2019,
                         month = 2,
                         day = 4,
                         hour = 7,
                         minute = 9,
                         second = 13 )
print(date_time, type(date_time))

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

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

date_time = datetime.datetime(year = 2019,
                         month = 2,
                         day = 4,
                         second = 13 )
# Получаем только время
time = date_time.strftime('%X')
print(time, type(time))

date = datetime.date(
                     year = 2018,
                     month = 5,
                     day = 3
                     )
# Получаем только год
year = date.year
print(year, type(year))

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

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

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

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

time = datetime.time(12, 33, second=33, microsecond=122)
print(time, type(time))
print(time.hour)

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

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

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

date_string = '21 September. 1999'
date_object = datetime.strptime(date_string, '%d %B. %Y')
print(date_object, type(date_object))

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

 

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

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

duration_time = datetime.timedelta(days = 12, seconds = 33)
print(duration_time, type(duration_time))

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

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

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

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

duration_time = datetime.timedelta(minutes = 1, seconds = 10)
# Преобразуем в секунды
seconds = duration_time.total_seconds()
print(seconds, type(seconds))

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

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

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

date_now = datetime.datetime.now()
date_tomorrow = datetime.datetime(2019, 12, 29)
# Вычисляем разницу между датами
difference = date_tomorrow - date_now
print(difference, type(difference))
print('Разница только в днях: ', difference.days)

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

 

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

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

duration_hours = datetime.timedelta(hours = 1)
duration_minutes = datetime.timedelta(minutes = 10)
result = duration_hours + duration_minutes
print(result, type(result))

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

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

date_now = datetime.datetime.now()
duration_minutes = datetime.timedelta(days=1, minutes=10)
result = date_now + duration_minutes
print(result, type(result))

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

 

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

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

date_one = datetime.datetime(2017,12,1)
date_two = datetime.datetime(2017,12,2)
if date_two > date_one:
    print('{0} больше чем {1}'.format(date_two, date_one))

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

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

date_one = datetime.datetime(2017,12,1)
date_two = datetime.datetime(2017,12,2)
if date_two.year == date_one.year:
    print('Год одинаковый. Тип данных: ', type(date_two.year))

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

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

time_one = datetime.timedelta(seconds=2)
time_two = datetime.timedelta(minutes=1)
if time_one < time_two:
    print('Pass')

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

 

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

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

1578238360

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

timestamp = date.fromtimestamp(1578238360)
print(timestamp)

Работа с UNIX timestamp Python datetime

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

timestamp = datetime.fromtimestamp(1578238360)
print(timestamp)

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

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

from datetime import datetime

date_now = datetime.now()
print(date_now.timestamp)

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

 

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

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

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

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

utc = datetime.datetime.utcnow()
print(utc)

Время UTC в Python Datetime

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

gmt = datetime.today() - datetime.utcnow()
print(gmt)

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

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

pip install pytz

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

import pytz
for tz in pytz.all_timezones:
    print(tz)

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

На примере ниже я перевожу локальное время в часовой пояс Киева:

import pytz
from datetime import datetime

tz_kiev = pytz.timezone('Europe/Kiev')
time_kiev = datetime.now(tz_kiev)
print(time_kiev)

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

 

...

Теги: #python #datetime


Популярные тэги
О блоге
Этот блог представляет собой конспекты выученного материала, преобретенного опыта и лучшие практики в системном администрировании и программировании.