Модуль 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))