Як обчислити різницю в часі в Python

При роботі з датами та часом у Python, доволі часто виникає потреба в обчисленні часових проміжків. У цьому мануалі ми розглянемо, як визначити різницю між двома часовими мітками, виражену в годинах, хвилинах та секундах.

Оволодівши матеріалом цього посібника, ви зможете:

  • користуватися модулем Python datetime для маніпуляцій з датами та часом;
  • зрозуміти, що таке об’єкти timedelta та в чому полягає їхня корисність;
  • вираховувати часову різницю між двома довільними часовими мітками, перетворюючи результат в години, хвилини та секунди.

Перейдімо до справи.

Застосування модуля Python datetime

Для роботи з датами та часом у Python існує модуль datetime. Цей модуль є складовою стандартної бібліотеки Python, тому його можна імпортувати без додаткових встановлень:

import datetime

Для обчислення часового проміжку, необхідно мати дві відмінні часові мітки. Їх можна створити у вигляді:

  • двох об’єктів дати;
  • двох об’єктів часу;
  • або комбінації дати і часу – об’єктів datetime.

Створення об’єкта дати в Python

Імпортуємо клас date з модуля datetime. Для створення об’єкта дати в Python використовується конструкція datetime.date(<рік>, <місяць>, <день>). Наприклад, створимо об’єкт дати date1:

from datetime import date
date1 = datetime.date(2022,3,27)
print(date1)
# Output: 2022-03-27

Ви можете перевірити цей код, використовуючи онлайн-компілятор Python techukraine.net або встановивши Python на свій комп’ютер.

Зверніть увагу, що вивід дати має формат РРРР-ММ-ДД.

Важливо: Місяць слід вказувати як ціле число без початкового нуля. Зазвичай, ми звикли додавати нуль перед номером місяця при записі дати.

Наприклад, для представлення червня, шостого місяця року, використовуйте 6, а не 06.

Спробуйте запустити наступний код, в якому місяць вказано як 03 замість 3. Ви побачите повідомлення про синтаксичну помилку:

date1 = datetime.date(2022,03,27)
print(date1)
# Error Message
File "<ipython-input-12-6eb72084e6ce>", line 1
    date1 = datetime.date(2022,03,27)
                                ^
SyntaxError: invalid token

Далі розглянемо, як створити об’єкт часу в Python.

Створення об’єкта часу в Python

Для створення об’єкта часу, імпортуємо клас time. Об’єкт часу можна створити, використовуючи клас time та вказавши такі атрибути: години, хвилини, секунди і мікросекунди.

Всі ці атрибути є необов’язковими. Якщо ви не вкажете певний атрибут, наприклад, секунду, вона за замовчуванням буде 0.

Наступний приклад ілюструє, як можна створити об’єкт часу time1. Подібно до об’єкта дати, ви можете вивести об’єкт часу на друк, щоб побачити його формат.

from datetime import time
time1 = datetime.time(13,27,45,4600)
print(time1)
# Output: 13:27:45.004600

Створення об’єкта datetime в Python

Об’єкт date не зберігає інформацію про час, а об’єкт time – про дату.

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

Доступ до класу datetime та створення його об’єктів відбувається наступним чином:

dt1 = datetime.datetime(2022,3,27,13,27,45,46000)
print(dt1)
# Output: 2022-03-27 13:27:45.046000

Створимо ще один об’єкт datetime, dt2, без вказання секунд. Ви побачите, що їхнє значення буде 0 – за замовчуванням.

dt2 = datetime.datetime(2022,6,30,14,28)
print(dt2)
# Output: 2022-06-30 14:28:00

Отже, ми навчилися створювати мітки часу в Python – дати, час та їх комбінації. Настав час дізнатися, як обчислити різницю між двома часовими мітками.

Продовжимо в наступному розділі.

Використання об’єкта timedelta в Python

У Python timedelta представляє собою часовий проміжок. Це різниця між двома об’єктами дати, часу або дати й часу.

Операція додавання або віднімання між двома об’єктами дати, часу або дати й часу створює об’єкт 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)) 
# Output 
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)
# Sample Output: 2022-01-22 09:10:18.489538

У наведеному нижче коді замініть значення bday на свою дату народження, щоб обчислити, скільки часу залишилось до вашого дня народження цього року.

Якщо ви читаєте це вже після того, як ваш день народження минув, встановіть bday на наступний день народження.

bday = datetime.datetime(2022,8,30,11,59)
print(bday)
# Sample Output: 2022-08-30 11:59:00

Далі обчислимо time_diff, який є об’єктом timedelta, як зазначалося раніше. Віднімемо поточну дату від дати дня народження, щоб отримати різницю в часі.

time_diff = bday - today
print(f"Your birthday is in {time_diff}")
# Output
Your birthday is in 220 days, 2:46:00.127416

Щоб дізнатися кількість днів, що залишились, скористайтеся атрибутом days об’єкта time_diff, як показано нижче:

tdays = time_diff.days
print(f"Your birthday is in {tdays} days.")
# Output
Your birthday is in 220 days.

Обчислення різниці в часі в секундах

Тепер обчислимо, скільки секунд залишилось до вашого дня народження.

Для обчислення загальної різниці в часі в секундах, використовуйте метод total_seconds() об’єкта timedelta, яким є time_diff.

tsecs = time_diff.total_seconds()
print(f"Your birthday is {tsecs} seconds away.")
# Output
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.")
# Output
Your birthday is 316966.0021236 minutes away.

Обчислення різниці в часі в годинах

Тепер, коли відома різниця часу в хвилинах, її можна поділити на 60, щоб отримати різницю в годинах. Або ж можна поділити загальну кількість секунд на 60 * 60 = 3600.

thrs = tsecs/(60*60)
print(f"Your birthday is {thrs} hours away.")
# Output
Your birthday is 5282.76670206 hours away.

Отже, тепер ви навчилися обчислювати різницю в часі у будь-яких одиницях виміру.

Висновок

У цьому посібнику ви навчилися:

  • створювати та працювати з датами та часом, використовуючи модуль datetime Python;
  • використовувати об’єкти timedelta для отримання часового проміжку або різниці в часі;
  • обчислювати різницю в часі в секундах, хвилинах та годинах.

Сподіваємося, цей посібник був для вас корисним. Тепер, коли ви знаєте все про обчислення часових проміжків у Python, настав час застосувати свої знання на практиці.

Успішного навчання та програмування!

Дізнайтеся, як написати код для порівняння “дорівнює” або “не дорівнює” або створити гру “змійка” на python тут.