Модуль datetime

Основний функціонал для роботи з датами і часом зосереджений в модулі datetime у вигляді наступних класів:

  • date
  • time
  • datetime

Клас date

Для роботи з датами скористаємося класом date, який визначений в модулі datetime. Для створення об'єкта date ми можемо використовувати конструктор date, який послідовно приймає три параметри: рік, місяць і день.

date (year, month, day)

Наприклад, створимо якусь дату:

import datetime
 
yesterday = datetime.date(2020,5, 2)
print(yesterday) # 2020-05-02

Якщо необхідно отримати поточну дату, то можна скористатися методом today():

from datetime import date
 
today = date.today()
print(today) # 2020-05-03
print("{}.{}.{}".format(today.day, today.month, today.year)) # 3.5.2020

За допомогою властивостей day, month, year можна отримати відповідно день, місяць і рік

Клас time

За роботу з часом відповідає клас time. Використовуючи його конструктор, можна створити об'єкт часу:

time([hour] [, min] [, sec] [, microsec])

Конструктор послідовно приймає години, хвилини, секунди і мікросекунди. Всі параметри необов'язкові, і якщо ми якийсь параметр не передаватимемо, то відповідне значення ініціалізується нулем.

from datetime import time
 
current_time = time()
print(current_time) # 00:00:00
 
current_time = time(16, 25)
print(current_time) # 16:25:00
 
current_time = time(16, 25, 45)
print(current_time) # 16:25:45

Клас datetime

Клас datetime з однойменного модуля об'єднує можливості роботи з датою і часом. Для створення об'єкта datetime можна використовувати наступний конструктор:

datetime(year, month, day [, hour] [, min] [, sec] [, microsec])

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

from datetime import datetime
 
deadline = datetime(2020, 5, 10)
print(deadline) # 2020-05-10 00:00:00
 
deadline = datetime (2020, 5, 10, 4, 30)
print(deadline) # 2020-05-10 4:30:00

Для отримання поточних дати і часу можна викликати метод now():

from datetime import datetime
 
now = datetime.now()
print(now) # 2020-05-03 11: 18: 56.239443
 
print( "{}.{}.{} {}:{}". format (now.day, now.month, now.year, now.hour, now.minute)) # 3.5.2020 11:21
 
print(now.date())
print(now.time())

За допомогою властивостей day, month, year, hour, minute, second можна отримати окремі значення дати і часу. А через методи date () і time () можна отримати окремо дату і час відповідно.

Перетворення з рядка в дату

З функціональності класу datetime слід зазначити метод strptime(), який дозволяє розпарсити рядок і перетворити її в дату. Цей метод приймає два параметри:

strptime (str, format)

Перший параметр str представляє строкове визначення дати і часу, а другий параметр - формат, який визначає, як різні частини дати і часу розташовані в цьому рядку.

Для визначення формату ми можемо використовувати такі коди:

  • % D: день місяця у вигляді числа
  • % M: порядковий номер місяця
  • % Y: рік у вигляді 2-х чисел
  • % Y: рік у вигляді 4-х чисел
  • % H: годину в 24-х годинному форматі
  • % M: хвилина
  • % S: секунда

Застосуємо різні формати:

from datetime import datetime
deadline = datetime.strptime("22/05/2020", "% d /% m /% Y")
print(deadline) # 2020-05-22 00:00:00
 
deadline = datetime.strptime("22/05/2020 12:30", "% d /% m /% Y% H:% M")
print(deadline) # 2020-05-22 12:30:00
 
deadline = datetime.strptime("05-22-2020 12:30", "% m-% d-% Y% H:% M")
print(deadline) # 2020-05-22 12:30:00

Форматування дати і часу

Для форматування об'єктів date і time в обох цих класах передбачено метод strftime(format). Цей метод приймає тільки один параметр, який вказує на формат, в який потрібно перетворити дату або час.

Для визначення формату ми можемо використовувати один з наступних кодів форматування:

  • % a: абревіатура дня тижня. Наприклад, Wed - від слова Wednesday (за замовчуванням використовуються англійські найменування)
  • % A: день тижня повністю, наприклад, Wednesday
  • % b: абревіатура назви місяця. Наприклад, Oct (скорочення від October)
  • % B: назва місяця повністю, наприклад, October
  • % d: день місяця, доповнений нулем, наприклад, 01
  • % m: номер місяця, доповнений нулем, наприклад, 05
  • % y: рік у вигляді 2-х чисел
  • % Y: рік у вигляді 4-х чисел
  • % H: годину в 24-х годинному форматі, наприклад, 13
  • % I: годину в 12-годинному форматі, наприклад, 01
  • % M: хвилина
  • % S: секунда
  • % f: мікросекунда
  • % p: покажчик AM/PM
  • % c: дата і час, відформатовані під поточну локаль
  • % x: дата, відформатована під поточну локаль
  • % X: час, відформатований під поточну локаль

Використовуємо різні формати:

from datetime import datetime
now = datetime.now()
print(now.strftime("% Y-% m-% d")) # 2020-05-03
print(now.strftime("% d /% m /% Y")) # 03/05/2020
print(now.strftime("% d /% m /% y")) # 03/05/20
print(now.strftime("% d% B% Y (% A)")) # 03 May 2020 (Wednesday)
print(now.strftime("% d /% m /% y% I:% M")) # 03/05/20 01:36

При виведенні назв місяців і днів тижня за замовчуванням використовуються англійські назви. Якщо ми хочемо використовувати поточну локаль, то ми можемо її попередньо встановити за допомогою модуля locale:

from datetime import datetime
import locale
locale.setlocale(locale.LC_ALL, "")
 
now = datetime.now()
prin (now.strftime("% d% B% Y (% A)")) № 03 Май 2017 (середа)

Додавання і віднімання дат і часу

Нерідко при роботі з датами виникає необхідність додати до якої-небудь дати певний проміжок часу або, навпаки, відняти деякий період. І спеціально для таких операцій в модулі datetime визначено клас timedelta. Фактично цей клас визначає деякий період часу.

Для визначення проміжку часу можна використовувати конструктор timedelta:

timedelta([days] [, seconds] [, microseconds] [, milliseconds] [, minutes] [, hours] [, weeks])

У конструктор ми послідовно передаємо дні, секунди, мікросекунди, мілісекунди, хвилини, години і тижні.

Визначимо кілька періодів:

from datetime import timedelta
 
three_hours = timedelta(hours = 3)
print(three_hours) # 3:00:00
three_hours_thirty_minutes = timedelta(hours = 3, minutes = 30) # 3:30:00
 
two_days = timedelta(2) # 2 days, 0:00:00
 
two_days_three_hours_thirty_minutes = timedelta(days = 2, hours = 3, minutes = 30) # 2 days, 3:30:00

Використовуючи timedelta, ми можемо складати або віднімати дати. Наприклад, отримаємо дату, яка буде через два дні:

from datetime import timedelta, datetime
 
now = datetime.now()
print(now) # 2017-05-03 17: 46: 44.558754
two_days = timedelta(2)
in_two_days = now + two_days
print(in_two_days) # 2017-05-05 17: 46: 44.558754

Або дізнаємося, скільки було часу 10 годині 15 хвилин назад, тобто фактично нам треба відняти від поточного часу 10 годин і 15 хвилин:

from datetime import timedelta, datetime
 
now = datetime.now()
till_ten_hours_fifteen_minutes = now - timedelta(hours = 10, minutes = 15)
print(till_ten_hours_fifteen_minutes)

Властивості timedelta

Клас timedelta має кілька властивостей, за допомогою яких ми можемо отримати часовий проміжок:

  • days: повертає кількість днів
  • seconds: повертає кількість секунд
  • microseconds: повертає кількість мікросекунд

Крім того, метод total_seconds() повертає загальна кількість секунд, куди входять і дні, і власне секунди, і мікросекунди.

Наприклад, дізнаємося який часовий період між двома датами:

from datetime import timedelta, datetime
 
now = datetime.now()
twenty_two_may = datetime (2017, 5, 22)
period = twenty_two_may - now
print("{} днів {} секунд {} мікросекунд" .format (period.days, period.seconds, period.microseconds))
# 18 днів 17537 секунд 72765 мікросекунд
 
print("Всього: {} секунд" .format (period.total_seconds ()))
# Всього: 1572737.072765 секунд

Порівняння дат

Також як і рядки і числа, дати можна порівнювати за допомогою стандартних операторів порівняння:

from datetime import datetime
 
now = datetime.now()
deadline = datetime(2017, 5, 22)
if now> deadline:
    print("Термін здачі проекту пройшов")
elif now.day == deadline.day and now.month == deadline.month and now.year == deadline.year:
    print("Термін здачі проекту сьогодні")
else:
    period = deadline - now
    print("Залишилося {} днів" .format (period.days))