Чтобы работать с форматом даты и времени, в языке программирования Python есть специальный модуль datetime. Он стандартный и встроен в язык, его не нужно скачивать и устанавливать отдельно. С его помощью разработчики узнают текущее время, вычисляют разницу между датами и делают многое другое.
Рассказываем, как устроен модуль datetime, какие возможности в него входят и какие операции над датой и временем он позволяет проводить.
Что входит в модуль datetime
Модуль datetime в Python содержит несколько основных компонентов:
- date — дата;
- time — время;
- datetime — и дата, и время;
- timedelta — временной интервал;
- tzinfo — информация о часовых поясах.
Класс datetime называется так же, как модуль целиком, не перепутайте. Мы будем разделять между собой понятия класса и модуля.
Чтобы пользоваться компонентами модуля, его сперва нужно подключить к программе. Для этого достаточно написать в начале программы строку:
import datetime
После этого можно вызывать методы и создавать объекты классов, которые есть в модуле. А еще — возвращать дату и время, записывать их в переменные и проводить над ними арифметические операции.
Разберем подробнее, что позволяет делать каждый из компонентов.
datetime.date в Python: как получить дату и работать с ней
Класс date позволяет создать объект, в котором хранится какая-либо дата — сегодняшняя или произвольная. Потом с этим объектом можно работать: передавать куда-то или вычислять.
Как создать объект с датой
Это можно сделать тремя способами.
Передать конкретную дату. В этом случае в конструктор класса нужно передать три параметра: год, месяц и день. Например, код ниже создает объект с датой 15 февраля 2025 года и записывает эту дату в переменную feb:
feb = datetime.date(2022, 02, 15)
Получить сегодняшнюю дату. Для этого не нужно писать конкретные цифры — программу могут запускать в разные дни, и актуальная информация будет меняться. Вместо этого можно использовать специальный метод today():
today_date = datetime.date.today()
В переменную today_date передастся текущая дата. Например, если запустить этот код 25 марта 2025 года, именно эта дата запишется в today_date.
Использовать timestamp. Так называется временная метка Unix — количество секунд, которое прошло с 1 января 1970 года по времени UTC. Это количество можно сконвертировать в дату: в Python для этого есть метод fromtimestamp(). Выглядит это так:
some_date = datetime.date.fromtimestamp(3486970)
В переменную some_date запишется дата, актуальная в тот момент, когда с 1 января 1970 года прошло 3486970 секунд.
Как вывести дату на экран
Вывести дату в Python можно с помощью стандартной функции print(). Можно вывести на экран переменную, в которой сохранена дата, или сразу передать в функцию print() вызов какого-то из методов. Например, так:
print(datetime.date.today())
На экране появится сегодняшняя дата. Такой же результат получился бы, если бы в функцию print() передали переменную today_date из примера выше.
Как получить день, месяц или год
Из даты можно извлечь ее составляющие — атрибуты, которые хранятся в объекте класса date:
- year — год;
- month — месяц;
- day — день.
Например, этот код выведет на экран год даты, записанный в переменной some_date:
print(some_date.year)
После слов year, month и day не ставим круглые скобки (), потому что это не методы — то есть не функции. Это атрибуты — переменные, которые принадлежат объекту класса.
У атрибутов могут быть только значения, которые соответствуют реально возможным числам даты. Например, в атрибуте day может храниться число от 1 до 31, а в атрибуте month — от 1 до 12. Интереснее дела обстоят с годом: его значение находится в диапазоне от 1 до 9999.
То есть технически Python дает возможность работать с датами из далекого будущего, вплоть до сотого века нашей эры.
datetime.time: как работать с временем
Для хранения времени в модуле datetime есть отдельный класс — time. Объект этого класса создается примерно так же, как объект с датой, но есть особенности.
Если вызвать конструктор класса time без параметров, задается нулевое время: 0 часов, 0 минут и 0 секунд. Выглядеть это будет так:
null_time = datetime.time()
Чтобы задать конкретное время, нужно передать параметры: часы, минуты и секунды. По желанию можно добавить четвертый параметр — микросекунды. Если не добавлять его, количество микросекунд будет равно нулю.
Например, этот код задает переменной some_time значение времени 11 часов 45 минут 15 секунд:
some_time = datetime.time(11, 45, 15)
В объекте класса времени точно так же хранятся атрибуты, к которым можно обращаться напрямую:
- hour — часы;
- minute — минуты;
- second — секунды;
- microsecond — микросекунды.
Например, вывести на экран количество секунд во времени, записанном в переменной some_time, можно так:
print(some_time.second)
У значений атрибутов опять же есть ограничения. Они не могут быть отрицательными, количество часов не должно превышать 23, а количество минут и секунд должно быть не больше 59. Если при сложении или вычитании получится большее число, время автоматически скорректируется.
То есть если прибавить ко времени 23:59 две минуты — получится время 0:01.
datetime.datetime — и дата, и время
Этот класс — комбинация двух предыдущих. Он одновременно хранит и дату, и время. Работать с ним можно по тому же принципу, что с date или time, но есть и особенности.
При создании объекта этого класса в него можно передать целых семь параметров: год, месяц, день, часы, минуты, секунды и миллисекунды. Первые три параметра обязательны: дата не может быть нулевой, в отличие от времени. Остальные четыре указываются по желанию.
Например, этот код создает объект с датой и временем 25 июля 2005 года, 12 часов 33 минут 40 секунд:
date_and_time = datetime.datetime(2005, 7, 25, 12, 33, 40)
Кроме того, в классе datetime есть метод, позволяющий задать текущие дату и время, — now(). Вот как это выглядит:
current = datetime.datetime.now()
Текущую дату и время Python берет из настроек компьютера. То есть если установить на устройстве неверную дату — такую же неверную дату вернет метод now().
Из объекта можно извлечь дату или время — для этого есть методы date() и time(). Например, этот код выведет на экран время из переменной current:
print(current.time())
В отличие от обращения к атрибутам, date() и time() — методы. Поэтому они пишутся с круглыми скобками () после названия. Кроме того, есть метод timestamp() — он возвращает временную метку.
datetime.timedelta: временные промежутки и интервалы
В модуле datetime есть отдельный класс timedelta. Он хранит временные интервалы и полезен, например, для арифметических операций с временем или расчетов даты.
Создать объект класса timedelta можно самостоятельно — передать параметры, которых у него довольно много. Это дни, секунды, микро- и миллисекунды, минуты, часы, недели и многое другое. Чтобы не запутаться, можно отдельно прописывать имя каждого параметра при создании объекта:
some_interval = datetime.timedelta(days = 1, seconds = 5, microseconds = 0, milliseconds = 0, minutes = 15, hours = 2, weeks = 3)
Этот код создаст интервал длиной три недели, один день, два часа, 15 минут и пять секунд.
Второй вариант получить временной промежуток — провести арифметическую операцию с объектами классов date или time. Например, вычесть одно время из другого, чтобы найти разницу между ними.
Допустим, есть два объекта класса datetime — A и B. Время A — 15:45, время B — 15:40. Если вычесть B из A, результатом будет объект класса timedelta — интервал длиной 5 минут. С датами принцип тот же.
С помощью timedelta можно вычислять будущие и прошлые даты или время. Объекты этого класса подходят для арифметических операций с объектами datetime или с другими объектами timedelta.
А вот использовать timedelta в арифметических операциях с объектами time нельзя. Невозможно прибавить к текущему времени час — Python выдаст ошибку.
Как изменить формат даты и времени
Дату и время можно представлять по-разному. Самый простой пример — запись: в России обычно используют формат день.месяц.год, а в Америке — месяц.день.год. Python позволяет выводить и дату, и время по-разному, в том числе писать название месяца словами или менять местами атрибуты. Для этого в модуле datetime есть два метода:
strftime(). Он создает из объекта класса date, time или datetime форматированную строку. Выглядит это так:
print(datetime.now().strftime("%m/%d/%Y, %H:%M:%S"))
Этот код выведет дату и время в формате «месяц/день/год, часы:минуты:секунды». Результат работы strftime() будет строкой.
Знаки процента и буквы в скобках после strftime — это так называемые коды формата. Каждый код означает какой-то из атрибутов. Например, %m — месяц, а %H — час. Подставлять их в strftime() можно в разном порядке — и получать разные форматы даты и времени.
strptime(). Этот метод действует ровно наоборот: превращает строку в объект класса datetime. Например, так:
date_from_string = datetime.strptime(“21 November, 2001”, "%d %B, %Y")
Первым аргументом в strptime() передают строку с датой, написанной в произвольном формате. Вторым аргументом — строку с кодами формата.
Код %B означает месяц, который записан словом. Его можно использовать, чтобы считывать или выводить дату в привычном нам формате.
Как работать с часовыми поясами
В модуле datetime есть отдельный инструментарий для изменения часовых поясов. Но информация о них есть не в любом объекте даты или времени.
- По умолчанию дата и время в Python не содержат информацию о временных зонах. Такие объекты называются naive. До этого мы рассматривали работу только с ними.
- Кроме naive, бывают дата и время, которые называются aware. Они содержат информацию о часовом поясе, а также о возможном переходе на летнее время.
Временную зону в Python тоже можно представить по-разному. Аббревиатура GMT означает привычное обозначение часового пояса, DMT — переход на летнее время. Но в программировании удобнее пользоваться стандартом UTC: он координирует временные зоны во всем мире.
Чтобы создать объект с заданным часовым поясом, нужно передать ему информацию о временной зоне. Список временных зон находится в отдельном от datetime модуле — pytz. То есть сначала нужно подключить этот модуль к программе:
import pytz
Затем сведения из модуля можно использовать, чтобы задать времени или дате часовой пояс. Сначала понадобится извлечь из pytz нужную временную зону:
timezone_berlin = pytz.timezone("Europe/Berlin")
А после этого создать объект класса datetime и передать в него информацию о временной зоне:
berlin_time = datetime.datetime.now(timezone_berlin)
В переменную berlin_time запишутся текущие дата и время по часовому поясу Берлина.
Коротко о модуле datetime
- Модуль datetime в Python содержит информацию для работы с датой и временем. С его помощью можно создавать объекты, которые хранят время, дату или обе этих сущности.
- В datetime есть возможность работать с временными промежутками — для этого в нем существует класс timedelta.
- Модуль позволяет получить текущие дату и время или задать произвольные. Время также может быть нулевым, а вот дата — нет.
- Дату и время можно представлять в разных форматах и в разных часовых поясах.