Модули и типы данных для работы со временем, датой и временными промежутками в языке программирования Python. Локализация
Типы данных date и time
Для удобной работы с датой и временем в Python есть модуль datetime. Он состоит из нескольких типов данных. Благодаря их наличию, программист получает доступ ко многим полезным функциям:
получение текущих системных даты и времени;
вычисление разницы между датами и другие арифметические операции над ними;
сравнение даты и времени;
форматированный вывод информации о дате и времени.
Типы данных модуля datetime
Название типа данных
Характеристика
date
Представляет собой информацию о дате на основе Григорианского календаря
time
Представляет собой информацию о времени
datetime
Содержит информацию о времени и дате на основе Григорианского календаря
timedelta
Описывает определённый период во времени, который находится между двумя различными моментами
tzinfo
Представляет различные сведения о часовом поясе
timezone
Содержит информацию о времени в формате UTC
Тип данных date
Для использования: from datetime import date.
Тип данных (класс) date используется для представления данных о дате и включает информацию о годе, месяце и дне. При создании новой даты нужно указать год, месяц и день. При этом, как и положено, нельзя указать значение day большее 31 и/или значение month большее 12:
1
2
3
4
5
6
fromdatetimeimportdatemy_date=date(1992,10,6)# тип date: год + месяц + деньprint(my_date)print(type(my_date))
1
2
3
# Вывод:
1992-10-06
<class 'datetime.date'>
Получить доступ к отдельным составляющим даты можно с помощью атрибутов year, month, day:
Метод today() нужен, чтобы получить текущую дату с компьютера: today_date = date.today()
С помощью метода weekday() можно определить день недели (нумерация начинается с нуля: 0=понедельник, 1=вторник, …, 6=воскресенье). Если нужна нумерация с единицы, можно воспользоваться методом isoweekday().
Атрибуты min и max используются, чтобы получить минимальную и максимальную соответственно возможную дату (в рамках типа данных date):
Тип данных (класс) time используется для представления данных о времени и включает информацию о часах, минутах, секундах и микросекундах (одна миллионная доля секунды). При создании времени нужно указать часы, минуты, секунды и микросекунды. При этом, значение hour не может быть больше 23, а значение second больше 59:
1
2
3
4
5
6
fromdatetimeimporttimemy_time=time(11,20,54,1234)# тип time: часы + минуты + секунды + микросекундыprint(my_time)print(type(my_time))
1
2
3
# Вывод:
11:20:54.001234
<class 'datetime.time'>
В отличие от дат (тип данных date), чтобы создать объект типа time, необязательно указывать все его атрибуты в конструкторе. Недостающие данные о времени автоматически заполняются нулями.
Так же, как и при работе с типом данных date, пользуясь типом time, можно получать доступ к отдельным значениям созданного времени: часам, минутам, секундам и микросекундам с помощью атрибутов hour, minute, second, microsecond:
Оба типа данных date и time являются неизменяемыми
Функции str() и repr()
Встроенная функция str() возвращает объект в неформальном (понятном человеку) строковом представлении. В следующем коде str() вызывается неявно и преобразует указанные объекты в понятный нам вид:
Для встроенных типов данных при печати одиночного значения объекта явно вызывать функцию str() не требуется, однако при печати списка таких объектов может произойти следующее:
По умолчанию вывод даты и времени осуществляется в ISO формате:
дата имеет вид: YYYY-MM-DD
время имеет вид: HH:MM:SS или HH:MM:SS.ffffff
Для форматированного вывода даты и времени используется метод strftime() (для обоих типов date и time):
1
2
3
4
5
6
7
8
9
10
11
fromdatetimeimportdate,timemy_date=date(2021,8,10)my_time=time(7,18,34)print(my_date)# вывод в ISO форматеprint(my_time)# вывод в ISO форматеprint(my_date.strftime('%d/%m/%y'))# форматированный вывод датыprint(my_date.strftime('%A %d, %B %Y'))# форматированный вывод датыprint(my_time.strftime('%H.%M.%S'))# форматированный вывод времени
1
2
3
4
5
6
# Вывод:
2021-08-10
07:18:34
10/08/21
Tuesday 10, August 2021
07.18.34
Таблица аргументов параметра:
Формат
Значение
Пример
%a
Сокращённое название дня недели
Sun, Mon, …, Sat (en_US) Пн, Вт, …, Вс (ru_RU)
При форматировании даты все временные характеристики сбрасываются в минимально возможные (нулевые значения). Аналогично при форматировании времени все характеристики даты сбрасываются в минимально возможные:
# Вывод:
Tue Tuesday 2 10 Aug August 08 21 2021 00 12 AM 00 00 000000 222 32 32 Tue Aug 10 00:00:00 2021 08/10/21 00:00:00
Mon Monday 1 01 Jan January 01 00 1900 07 07 AM 18 34 000000 001 00 01 Mon Jan 1 07:18:34 1900 01/01/00 07:18:34
Для создания новой даты на основе уже существующей можно использовать метод replace(). Он возвращает новую дату с переданными изменёнными значениями атрибутов year, month, day:
1
2
3
4
5
6
7
8
9
fromdatetimeimportdatedate1=date(1992,10,6)date2=date1.replace(year=1995)# заменяем год date3=date1.replace(month=12,day=17)# заменяем месяц и числоprint(date1)print(date2)print(date3)
1
2
3
4
# Вывод:
1992-10-06
1995-10-06
1992-12-17
Инфо
Аналогичным способом можно создать и новое время на основе существующего.
Для того, чтобы получить строковое представление объектов типа date и time в ISO формате, можно воспользоваться методом isoformat():
А чтобы преобразовать строку из ISO формата в объект date или time, можно воспользоваться методом fromisoformat().
Использование локализации
Для использования: import locale
Приведённый ниже код устанавливает русскую локализацию:
1
2
3
4
5
6
7
8
9
fromdatetimeimportdateimportlocalelocale.setlocale(locale.LC_ALL,'ru_RU.UTF-8')my_date=date(2021,8,10)print(my_date.strftime("%A %d, %B %Y"))# форматированный вывод даты в русской локализации# Вывод: вторник 10, Август 2021
Тип данных datetime
Для использования: from datetime import datetime
Этот тип данных позволяет работать одновременно и с датой, и с временем. Он является неизменяемым. При создании новой даты-времени (тип datetime) нужно указать год, месяц, день, часы, минуты, секунды и микросекунды. При этом год, месяц и день являются обязательными, а часы, минуты, секунды и микросекунды необязательными:
1
2
3
4
5
6
7
8
fromdatetimeimportdatetimemy_datetime=datetime(1992,10,6,9,40,23,51204)# создаем полную дату-времяonly_date=datetime(2021,12,31)# создаем дату-время с нулевой временной информациейprint(my_datetime)print(only_date)print(type(my_datetime))
Так же, как и при работе с типами date и time, в datetime с помощью атрибутов (year, month, day, hour, minute, second и microsecond) можно получать доступ к отдельным значениям созданной даты-времени: годам, месяцам, дням, часам, минутам, секундам и микросекундам:
# Вывод:
Год = 1992
Месяц = 10
День = 6
Часы = 9
Минуты = 40
Секунды = 23
Микросекунды = 51204
Инфо
Тип данных datetime наследует весь функционал (атрибуты и методы) от типа date
Методы datetime
Сформировать новый объект типа datetime можно с помощью двух разных объектов, представляющих дату и время (date и time). Для этого используется метод combine():
Если же, наоборот, нужно из datetime получить date и time, то используются методы date() и time() соответственно:
1
2
3
4
5
6
7
8
9
fromdatetimeimportdatetimemy_datetime=datetime(2022,10,7,14,15,45)my_date=my_datetime.date()# получаем только дату (тип date)my_time=my_datetime.time()# получаем только время (тип time)print(my_datetime,type(my_datetime))print(my_date,type(my_date))print(my_time,type(my_time))
Метод now() используется для получения локального времени:
Метод today() аналогичен методу now(), но рекомендуется использовать именно метод now().
Метод timestamp() преобразует объект типа datetime в количество секунд, прошедших с начала эпохи (возвращает значение типа float), а метод fromtimestamp(), наоборот, преобразует количество секунд, прошедших с начала эпохи, в datetime (возвращает объект datetime в локальном часовом поясе).
При работе с объектами типа datetime мы также можем использовать функции min(), max(), sorted() и операторы сравнения.
Если нужно создать новый объект datetime на основании уже существующего, можно использовать метод replace(), который вернёт новый объект datetime с переданными изменёнными значениями атрибутов:
Как и объекты типа date и time, datetime выводится в формате ISO 8601. Для преобразования в строку нужного формата нужно использовать старый-добрый метод strftime():
1
2
3
4
5
6
7
8
9
fromdatetimeimportdatetimemy_datetime=datetime(2021,8,10,18,20,34)print(my_datetime)# вывод в ISO форматеprint(my_datetime.strftime('%d.%m.%y --- %H::%M::%S'))print(my_datetime.strftime('%d/%m/%y'))print(my_datetime.strftime('%A %d, %B %Y'))print(my_datetime.strftime('%H:%M:%S'))
Преобразовать строку в объект типа datetime можно:
Вручную, используя split();
С помощью метода strptime().
Второй способ компактнее и читабельнее, поэтому поощряется в большей степени. Метод strptime() принимает два аргумента: первый – строку, второй – формат
Инфо
strptime() – это парсер, который превращает произвольную строку в объект типа datetime strftime() – это форматтер, который превращает объект datetime в строку заданного формата
Первый аргумент должен соответствовать формату второго аргумента. Иначе возникнет исключение ValueError
1
2
3
4
5
6
7
fromdatetimeimportdatetimemy_datetime=datetime.strptime('10/08/2034 13:55:59','%d.%m.%Y %H:%M:%S')print(my_datetime)# Вывод: ValueError: time data '10/08/2034 13:55:59' does not match format '%d.%m.%Y %H:%M:%S'
Инфо
При создании объекта datetime из строки с помощью метода strptime() необязательно, чтобы строка содержала год, месяц и день, в отличие от ручного создания этого объекта
Тип данных timedelta
Тип данных timedelta представляет собой временной интервал (разница между двумя объектами datetime или date) и используется для удобного выполнения различных манипуляций над типами datetime или date. Он, как и предыдущие, неизменяем.
При создании объекта timedelta можно указать следующие аргументы: недели (weeks), дни (days), часы (hours), минуты (minutes), секунды (seconds), миллисекунды (milliseconds), микросекунды (microseconds). Все они являются необязательными и по умолчанию равны нулю.
Для преобразования timedelta к строковому типу можно использовать встроенные функции str() и repr() (первая вызывается автоматически при печати значения объекта этого типа):
Деление временных интервалов друг на друга. По сути общая длительность первого интервала делится на общую длительность второго (которые вычисляются методом total_seconds()):
1
2
3
4
5
6
7
fromdatetimeimporttimedeltadelta1=timedelta(weeks=1)/timedelta(hours=5)# обычное деление, результат floatdelta2=timedelta(weeks=1)//timedelta(hours=5)# целочисленное деление, результат intprint(delta1)print(delta2)
1
2
3
# Вывод:
33.6
33
Также можно найти остаток от деления двух интервалов, при этом вернётся объект timedelta: