Python-программисту, при работе со значениями, представляющими дату и время, часто нужно вычислять длительность временных интервалов. Из этого материала вы узнаете о том, как находить разницу между двумя временными метками, выраженную в часах, минутах и секундах.
А именно, здесь мы коснёмся следующих вопросов:
- Как пользоваться Python-модулем
datetime
для работы с датой и временем.
- Что собой представляют объекты
timedelta
и что они могут дать программисту.
- Как вычислять продолжительность временных интервалов, выражая результат в разных единицах измерения.
Python-модуль datetime
Для работы с датой и временем в Python используется модуль
datetime
. Он является частью стандартной библиотеки Python. Для того чтобы применить этот модуль в своём проекте — достаточно его импортировать:
import datetime
Для вычисления продолжительности временного интервала нужно создать две различных отметки времени. Тут есть несколько вариантов:
- Два объекта
date
— стандартное представление даты.
- Два объекта
time
— стандартное представление времени.
- Два объекта
datetime
, комбинирующие сведения, которые обычно хранятся в объектах date
и time
.
Создание объектов date
Импортируем класс
date
из модуля
datetime
. Для того чтобы создать в Python объект
date
— можно воспользоваться обычной синтаксической конструкцией вида
datetime.date(<year>,<month>,<day>)
. Вот пример создания объекта
date
с именем
date1
:
from datetime import date
date1 = datetime.date(2022,3,27)
print(date1)
# Вывод: 2022-03-27
Этот код можно попробовать запустить в онлайн-интерпретаторе Python на
Geekflare. Ещё можно
установить Python у себя.
Из предыдущего примера видно, что дата выводится в формате
YYYY-MM-DD
.
Обратите внимание на то, что при создании объекта
date
месяц надо задавать с использованием целого числа, в начале которого нет дополнительных нулей. Обычно в числовой записи месяцев соответствующие числа дополняют нулями. Здесь же, например, чтобы указать Июнь, то есть — 6 месяц — нужно воспользоваться числом 6, а не 06.
Попробуйте запустить следующий фрагмент кода. Тут месяц намеренно записан неправильно — 03 вместо 3. Из-за этого возникает ошибка
SyntaxError
:
date1 = datetime.date(2022,03,27)
print(date1)
# Сообщение об ошибке
File "<ipython-input-12-6eb72084e6ce>", line 1
date1 = datetime.date(2022,03,27)
^
SyntaxError: invalid token
Поговорим теперь о том, как создавать объекты
time
.
Создание объектов time
Для создания объектов
time
импортируем класс
time
. При создании таких объектов указывают следующие атрибуты класса:
hour
,
minute
,
second
и
microsecond
. Они, соответственно, позволяют указывать часы, минуты, секунды и микросекунды.
Правда, все эти атрибуты являются необязательными. Если какой-то из них опустить, предположим —
second
, то он, по умолчанию, будет установлен в 0.
В следующем примере показано создание объекта
time
с именем
time1
. Так же, как и при работе с объектами
date
, объекты
time
можно выводить в консоль:
from datetime import time
time1 = datetime.time(13,27,45,4600)
print(time1)
# Вывод: 13:27:45.004600
Создание объектов datetime
Как видите, объекты типа
date
не содержат сведений о времени. А в объектах
time
нет информации о дате.
Но на практике обычно нужны данные и о дате, и о времени. Поэтому вместо двух вышеописанных классов рекомендуется прибегнуть к классу
datetime
.
Обратиться к этому классу и создать соответствующий объект (
dt1
) можно так:
dt1 = datetime.datetime(2022,3,27,13,27,45,46000)
print(dt1)
# Вывод: 2022-03-27 13:27:45.046000
Создадим ещё один объект
datetime
и дадим ему имя
dt2
, опустив при его создании атрибут
second
. Это приведёт к тому, что он будет установлен в значение по умолчанию — 0.
dt2 = datetime.datetime(2022,6,30,14,28)
print(dt2)
# Вывод: 2022-06-30 14:28:00
Итак, теперь вы знаете о том, как создавать Python-объекты
date
,
time
и
datetime
, представляющие отметки времени. Пришло время поговорить о том, как находить длительность временных интервалов.
Применение объектов timedelta
В Python объекты
timedelta
представляют собой сведения о промежутках времени. Это — разница двух объектов
date
,
time
или
datetime
.
Если сложить или вычесть два объекта
date
,
time
или
datetime
, получится объект
timedelta
. У этого объекта имеются полезные атрибуты и методы, которые могут помочь в деле нахождения длительности временных интервалов.
Посчитаем длительность интервала, задаваемого двумя объектами типа
datetime
—
dt1
и
dt2
:
dt1 = datetime.datetime(2022,3,27,13,27,45,46000)
dt2 = datetime.datetime(2022,6,30,14,28)
tdelta = dt2 - dt1
print(tdelta)
print(type(tdelta))
# Вывод
95 days, 1:00:14.954000
<class 'datetime.timedelta'>
Видно, что переменная
tdelta
хранит разницу между
dt1
и
dt2
. Тут, кроме того, пользуясь встроенной Python-функцией
type()
, мы проверили тип
tdelta
. Это —
timedelta
.
Проведём ещё один эксперимент.
Нахождение временного промежутка между двумя датами
Рассмотрим простой, но интересный пример.
Задача заключается в том, чтобы получить временную разницу между текущей датой (сегодняшним днём) и днём вашего рождения.
Для того чтобы её решить — надо сформировать первую отметку времени, указывающую на сегодняшний день, и вторую, указывающую на дату дня рождения.
Создадим пару объектов
datetime
:
- Первый будет хранить сегодняшнюю дату, мы назовём его
today
.
- Второй будет хранить дату дня рождения. Назовём его
bday
.
У класса
datetime
есть метод
now()
, который позволяет создавать объекты, содержащие сведения о текущем местном времени и дате. Воспользуемся этим методом для того чтобы получить сегодняшнюю дату, играющую роль точки отсчёта:
today = datetime.datetime.now()
print(today)
# Пример вывода: 2022-01-22 09:10:18.489538
Пробуя следующий код, замените значение, попадающее в
bday
, на дату своего дня рождения текущего года. Это позволит узнать о том, сколько времени вам ещё его ждать в этом году.
Если же ваш день рождения в этом году уже прошёл, можете записать в
bday
дату из следующего года.
bday = datetime.datetime(2022,8,30,11,59)
print(bday)
# Пример вывода: 2022-08-30 11:59:00
Следующий шаг нашей работы — нахождение разницы между двумя отметками времени. Её мы будем хранить в переменной
time_diff
. Подобные переменные, как мы уже говорили, имеют тип
timedelta
. Нам достаточно вычесть
today
из
bday
.
time_diff = bday - today
print(f"Your birthday is in {time_diff}")
# Вывод
Your birthday is in 220 days, 2:46:00.127416
Для того чтобы узнать о том, сколько полных дней осталось до дня рождения, можно воспользоваться атрибутом
days
объекта типа
timedelta
.
tdays = time_diff.days
print(f"Your birthday is in {tdays} days.")
# Вывод
Your birthday is in 220 days.
Выражение длительности временных промежутков в секундах
Теперь узнаем о том, сколько ждать дня рождения, выразив результат в секундах.
Для этого можно воспользоваться методом
total_seconds()
объекта типа
timedelta
. В следующем примере это — всё тот же объект
time_diff
.
tsecs = time_diff.total_seconds()
print(f"Your birthday is {tsecs} seconds away.")
# Вывод
Your birthday is 19017960.127416 seconds away.
Да, дня рождения придётся подождать!
Теперь вы знаете о том, как вычислять промежутки времени и выражать их в секундах.
Давайте вспомним то, что мы знаем о времени, и поговорим об измерении времени в днях, часах, минутах и секундах. В сутках 24 часа, в часе 60 минут, а 60 секунд — это минута.
Часы, минуты и секунды
Для перехода от секунд к минутам, дням или часам, можно воспользоваться следующей таблицей, деля значение в секундах на соответствующий коэффициент преобразования.
Воспользуемся этими знаниями.
Выражение длительности временных промежутков в минутах
Для того чтобы, имея данные о длительности промежутка времени, выраженные в секундах, узнать его длительность в минутах, нужно разделить общее число секунд на 60.
Разделим то, что хранится в переменной
tsecs
, на 60, и сохраним то, что получится, в переменной
tmins
:
tmins = tsecs/60
print(f"Your birthday is {tmins} minutes away.")
# Вывод
Your birthday is 316966.0021236 minutes away.
Выражение длительности временных промежутков в часах
Теперь посчитаем длительность временного промежутка, выраженную в часах. Учитывая то, что у нас уже есть значение, выраженное в минутах, для достижения этой цели его можно просто поделить на 60. Или можно поделить значение, выраженное в секундах, на 3600 (60*60).
thrs = tsecs/(60*60)
print(f"Your birthday is {thrs} hours away.")
# Вывод
Your birthday is 5282.76670206 hours away.
Теперь вы знаете о том, как представлять разные промежутки времени в нужном вам виде.
Итоги
Освоив это руководство, вы узнали следующее:
- Как создавать объекты, содержащие сведения о дате и времени, пользуясь модулем
datetime
, и как работать с такими объектами.
- Как пользоваться объектами типа
timedelta
для нахождения длительности временных промежутков или разницы между двумя объектами, содержащими сведения о дате или времени.
- Как выражать длительность временных промежутков в секундах, минутах и часах.
Надеюсь, вам пригодится то, о чём вы узнали. Теперь эти знания вполне можно применить
на практике.
Какие задачи вы решаете с помощью Python?