Модуль datetime

Модуль datetime из стандартной библиотеки языка программирования Python представляет собой сборник из самых разных классов для комфортной работы со временем и датами. За счет множества встроенных методов, предназначенных для удобного отображения, а также манипуляции над временем и датами, повышается функциональность некоторых программ.

Применение

Библиотека datetime используется для работы в Python со временем и датами, позволяя представлять данную информацию в наиболее удобной форме.

Она состоит из нескольких классов. Благодаря их наличию, программист получает доступ к многим полезным методам:

  • Получение текущих системных даты и времени;
  • Вычисления разницы между датами и другие арифметические операции;
  • Операциям, которые позволяют сравнивать время;
  • Форматированный вывод информации о дате и времени.

В модуле используются константы MINYEAR и MAXYEAR, которые равны 1 и 9999 соответственно. Это минимальное и максимально возможное значение года, используемые в библиотеке.

Отличие datetime от time

Но в Python помимо библиотеки datetime есть еще библиотека time. Давайте разберемся, какую из них нам следует использовать:

Модуль time обычно используется при работе с текущем временем, основывающемся на значении в секундах, прошедших с начала эпохи. Позволяет делать его форматированный вывод. Есть возможности установки пауз в выполнении скрипта с помощью метода sleep. Используется для вычисления времени работы программы с помощью monotonic.

В отличие от модуля time, в datetime есть несколько встроенных классов, позволяющих производить различные манипуляции с датой и временем, такие как арифметические операции или сравнение.

То есть, если требуется производить арифметические операции со временем, то тогда используем datetime.

Классы библиотеки

Модуль datetime включает в себя несколько разных классов, каждый из которых обладает собственными методами и свойствами, а также служит для определенных целей. Все они представлены в следующей таблице, где содержатся их названия и краткая характеристика.

Название Характеристика
date представляет собой дату, полностью исключая данные о времени, на основе Григорианского календаря
time включает данные о времени, полностью игнорируя сведения о дате
datetime содержит информацию о времени и дате, основываясь на данных из Григорианского календаря
timedelta описывает определенный период во времени, который находится между двумя различными моментами
tzinfo представляет различные сведения о часовом поясе
timezone описывает время, руководствуясь стандартом UTC

Далее будет рассмотрено как с помощью этих классов можно в Python работать с датой и временем. Разберем основные примеры использования библиотеки datetime.

date

Класс date используется для представления данных о дате, которые включают год, месяц и число. Чтобы иметь возможность применять этот класс, необходимо предварительно импортировать модуль datetime, поместив соответствующую инструкцию в начало файла с программным кодом. Для создания объектов типа date следует произвести вызов одноименного конструктора, указав ему в качестве параметров сведения о дате. При этом нельзя забывать о порядке, в котором находятся аргументы: год, затем месяц и число.

Следующий пример демонстрирует создание объекта date, где переменная под названием a получает три обозначенных выше значения. После этого сведения о дате выводятся на экран при помощи метода print, а функция type позволяет получить имя класса для этого объекта.

import datetime
a = datetime.date(2001, 10, 28)
print(a)
print(type(a))

2001-10-28
<class 'datetime.date'>

Если необходимо в Python получить информацию о текущей дате, совсем необязательно вызывать стандартный конструктор date и вручную вбивать подходящие значения. С этой задачей как нельзя лучше справляется встроенный метод today. В следующем фрагменте кода показано как можно быстро присвоить сегодняшнюю дату объекту, а затем вывести эту информацию.

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

2018-11-08

Иногда приходится работать не только с общими сведениями о дате, но и с отдельными ее составляющими, годом, месяцем или днем. Получить доступ к данным свойствам объекта можно с помощью оператора точки. Однако следует помнить, что изменить их у текущего объекта нельзя. В следующем примере показывается как переменная a инициализируется с помощью конструктора, после чего на экране отображаются все ее свойства по-отдельности.

import datetime
a = datetime.date(2012, 7, 21)
print(a.year)
print(a.month)
print(a.day)

2012
7
21

time

Класс time служит для демонстрации данных о времени, полностью игнорируя дату. Как и в случае с предыдущим классом date, следует импортировать модуль datetime с помощью ключевого слова import. Создать объект, принадлежащий к типу time можно с помощью конструктора, который принимает такие аргументы как количество часов, минут, секунд и микросекунд. Указывая данные параметры, не стоит забывать об их необходимом порядке, расставляя числа на правильных позициях. Также нужно помнить, что существуют ограничения, к примеру, нельзя отображать время со значением более 59 на месте секунд.

В следующем фрагменте кода создается переменная a, которой присваивается объект типа time с четырьмя разными свойствами: число часов, минут, секунд и микросекунд. Благодаря методу print выводится информация об этом объекте, а функция type отображает его класс.

import datetime
a = datetime.time(12, 18, 35, 5867)
print(a)
print(type(a))

12:18:35.005867
<class 'datetime.time'>

Чтобы создать объект типа time необязательно указывать все его свойства в конструкторе. Как видно из результатов выполнения описанной ниже программы, недостающие данные о времени автоматически заполняются нулями, в то время как введенные числа добавляются в объект от большего к меньшему. Таком образом, инициализируются три разных переменных a, b и c, после чего методы print выводят информацию об их текущем состоянии на дисплей.

import datetime
a = datetime.time(23, 5, 30)
b = datetime.time(7, 26)
c = datetime.time(21)
print(a)
print(b)
print(c)

23:05:30
07:26:00
21:00:00

Также, как и в классе date, пользуясь time, можно получать доступ к отдельным значениям созданного ранее объекта: часам, минутам, секундам и микросекундам. Для этого нужно применить оператор точка, после чего указать конкретное свойство. В следующем примере демонстрируется вывод информации, представляющей отдельные сведения об объекте a.

import datetime
a = datetime.time(16, 3, 49, 23578)
print(a.hour)
print(a.minute)
print(a.second)
print(a.microsecond)

16
3
49
23578

datetime

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

import datetime
c = datetime.datetime(2017, 7, 18, 4, 52, 33, 51204)
print(c)
print(type(c))

2017-07-18 04:52:33.051204
<class 'datetime.datetime'>

Создавать объекты можно с разным набором параметров, указывая только нужные сведения. Отсутствующие данные по умолчанию будут заполнены нулями. Приведенный ниже код показывает, как создаются два объекта a и b, первый из которых изначально содержит только дату, а второй обладает информацией о дате и о времени.

import datetime
a = datetime.datetime(2007, 2, 13)
b = datetime.datetime(2013, 10, 25, 12, 8, 47)
print(a)
print(b)

2007-02-13 00:00:00
2013-10-25 12:08:47

Получить текущий момент времени можно при помощи двух разных методов, один из которых уже использовался ранее в date. Следующий код демонстрирует вызов функций today и now, возвращающих в Python текущую дату и время с точностью до микросекунд. Метод print как обычно позволяет отобразить эти сведения на дисплее.

import datetime
a = datetime.datetime.today()
b = datetime.datetime.now()
print(a)
print(b)

2018-11-08 11:12:53.256261
2018-11-08 11:12:53.256270

Существует определенный формат, в котором дата и время выводятся по умолчанию, но данное представление не всегда удовлетворяет запросы пользователя.

Чтобы в Python преобразовать дату и время в строку нужного формата, следует воспользоваться методом strftime, указав ему в качестве аргумента параметры форматирования. Как можно понять из примера, который находится ниже, за воспроизведение информации о количестве дней или минут отвечают специальные зарезервированные символы, идущие следом за знаком процента.

Стоит заметить, что здесь создаются два совершенно идентичных объекта при помощи метода today. Однако, благодаря работе функции strftime, каждый из них получает свою форму для вывода на экран (день, месяц и год для переменной a, час, минута, секунда для переменной b). После этого метод print отображает сведения в заданном ранее формате.

import datetime
a = datetime.datetime.today().strftime("%d.%m.%Y")
b = datetime.datetime.today().strftime("%H:%M:%S")
print(a)
print(b)

08.11.2018
11:41:04

Доступные типы форматов для вывода через консоль располагаются в следующей таблице. Здесь можно найти их обозначения, а также краткое описание того, что именно они делают.

Формат Значение
%a название дня недели в сокращенном виде
%A название дня недели в полном виде
%w номер дня недели в виде целого числа
%d номер дня месяца в виде целого числа
%b название месяца в сокращенном виде
%B название месяца в полном виде
%m номер месяца в числовом представлении
%y номер года без столетия
%Y номер года в полном представлении
%H количество часов в 24-часовом формате
%I количество часов в 12-часовом формате
%p до полудня или после полудня в 12-часовом формате
%M количество минут в виде целого числа
%S количество секунд в виде целого числа
%f количество микросекунд в виде целого числа
%z часовой пояс в формате UTC
%Z название часового пояса
%j номер дня в году
%U номер недели в году, если считать с воскресенья
%w номер недели в году, если считать с понедельника
%c местное представление даты и времени
%x местное представление даты
%X местное представление времени
%% символ процента

Как и в случае с time и date, в классе datetime пользователь в состоянии получать доступ к отдельным свойствам созданного объекта (годам, месяцам, дням, часам, минутам, секундам и микросекундам. В следующем примере кода демонстрируется вывод данных значений.

import datetime
a = datetime.datetime(2015, 3, 27, 8, 12, 24, 34574)
print(a.year)
print(a.month)
print(a.day)
print(a.hour)
print(a.minute)
print(a.second)
print(a.microsecond)

2015
3
27
8
12
24
34574

Сформировать новый объект типа datetime можно и с помощью двух разных объектов, представляющих время и дату (time и date). Для этого используется функция combine. В следующем примере показывается как переменные a и b получают некоторые значения, после чего передаются методу combine в качестве двух параметров.

from datetime import datetime, date, time
a = date(2015, 3, 19)
b = time(2, 10, 43)
c = datetime.combine(a, b)
print(c)

2015-03-19 02:10:43

Операции

Пользуясь классом datetime, можно легко находить разницу между двумя разными датами. Следующим пример демонстрирует создание двух объектов. Переменная a представляет собой дату, которую передает ей метод now, а b задается при помощи конструктора вручную. Выполнив простую операцию нахождения разницы между объектами a и b, можно получить третий объект c. Применение функции print позволяет напрямую вывести на экран его свойства за счет оператора точки.

from datetime import datetime
a = datetime.now()
b = datetime(2015, 3, 21)
c = a - b
print(c.days)
print(c.seconds)
print(c.microseconds)

1328
43219
65190

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

Операция Значение
a + b суммирует значения дат a и b
a – b находит разницу между датами a и b
a * i умножает численное представление свойств даты a на некую константу i
a // i делит численное представление свойств даты a на некую константу i, остаток отбрасывается
+a возвращает объект timedelta с полностью идентичным значением a
–a возвращает объект timedelta с полностью противоположным значением a
a > b возвращает true, если a больше b
a < b возвращает true, если a меньше b
abs(a) возвращает объект timedelta с положительным значением всех свойств a
str(a) возвращает строковое представление объекта a в формате, заданном по умолчанию
repr(a) возвращает строковое представление объекта a в формате с отрицательными значениями

timedelta

Класс timedelta предназначен для удобного выполнения различных манипуляций над датами и временем. Можно создать объект данного класса, воспользовавшись конструктором. Аргументами являются дни, часы, минуты, секунды, микросекунды и недели, задать которые можно с помощью прямого обращения к именам свойств, как это показано в следующем примере. Как и раньше, метод print позволяет выводить сведения о дате на экран, а функция type отображает тип созданного объекта.

from datetime import timedelta
a = timedelta(days=5, hours=21, minutes=2, seconds=37)
print(a)
print(type(a))

5 days, 21:02:37
<class 'datetime.timedelta'>

Также можно прибавлять разные даты, формируя тем самым новый объект. В следующем примере показано, как получить сумму двух разных дат, воспользовавшись арифметической операцией для переменных a и b. Результат данного действия присваивается объекту под названием c, после чего выводится на экран в обычном формате при помощи метода print.

from datetime import datetime, timedelta
a = datetime(2006, 12, 5)
b = timedelta(hours=2, minutes=5, seconds=17)
print(a)
c = a + b
print(c)

2006-12-05 00:00:00
2006-12-05 02:05:17

tzinfo и timezone

Классы tzinfo и timezone применяются для работы с информацией, которая содержит сведения о часовых поясах. Создать объект, принадлежащий типу tzinfo невозможно, поскольку этот класс является абстрактным. Однако можно воспользоваться наследованием, создав собственный класс на основе tzinfo. При этом следует помнить, что для работы с такими объектами придется реализовать несколько абстрактных методов, к числу которых относятся utcoffset (смещение по местному времени с UTC), dst (настройка перехода на летнее время), а также функция tzname (имя часового пояса в виде строки).

from datetime import tzinfo, timedelta, datetime, timezone
class UTC0530(tzinfo):
    def __init__(self, offset=19800, name=None):
        self.offset = timedelta(seconds=offset)
        self.name = name or self.__class__.__name__
    def utcoffset(self, dt):
        return self.offset
    def tzname(self, dt):
        return self.name
    def dst(self, dt):
        return timedelta(0)
a = datetime.now(timezone.utc)
print(a)
b = datetime.now(UTC0530())
print(b)
print(b.utcoffset())
print(b.tzname())
print(b.dst())

2018-11-09 11:00:11.889875+00:00
2018-11-09 16:30:11.890014+05:30
5:30:00
UTC0530
0:00:00

В приведенной программе демонстрируется создание пользовательского класса UTC0530, в котором описаны методы utcoffset, dst и tzname, а также применение нового типа с двумя объектами a и b. Таким образом, получается отображение времени со смещением +5:30.

Заключение

Таким образом, пользуясь классами из библиотеки datetime, можно повысить эффективность работы программ, которые взаимодействуют со временем и датой. Возможности встроенных методов позволяют не только отображать нужные сведения в удобном формате, но также по-разному манипулировать ими, например, добавляя либо отнимая часы, минуты и секунды.