Фоматирование дат и времени
Для форматирования объектов 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: время, форматированное под текущую локаль
Используем различные форматы:
| 1 2 3 4 5 6 7 | from datetime import datetimenow = datetime.now()print(now.strftime("%Y-%m-%d")) # 2017-05-03print(now.strftime("%d/%m/%Y")) # 03/05/2017print(now.strftime("%d/%m/%y")) # 03/05/17print(now.strftime("%d %B %Y (%A)")) # 03 May 2017 (Wednesday)print(now.strftime("%d/%m/%y %I:%M")) # 03/05/17 01:36 |
При выводе названий месяцев и дней недели по умолчанию используются английские наименования. Если мы хотим использовать текущую локаль, но то мы можем ее предварительно установить с помощью модуля locale:
| 1 2 3 4 5 6 | from datetime import datetimeimport localelocale.setlocale(locale.LC_ALL, "")now = datetime.now()print(now.strftime("%d %B %Y (%A)")) # 03 Май 2017 (среда) |
Сложение и вычитани дат и времени
Нередко при работе с датами возникает необходимость добавить к какой-либо дате определенный промежуток времени или, наоборот, вычесть некоторый период. И специально для таких операций в модуле datetime определен класс timedelta. Фактически этот класс определяет некоторый период времени.
Для определения промежутка времени можно использовать конструктор timedelta:
| 1 | timedelta([days] [, seconds] [, microseconds] [, milliseconds] [, minutes] [, hours] [, weeks]) |
В конструктор мы последовательно передаем дни, секунды, микросекунды, миллисекунды, минуты, часы и недели.
Определим несколько периодов:
| 1 2 3 4 5 6 7 8 9 | from datetime import timedeltathree_hours = timedelta(hours=3)print(three_hours) # 3:00:00three_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, мы можем складывать или вычитать даты. Например, получим дату, которая будет через два дня:
| 1234567 | from datetime import timedelta, datetime now = datetime.now()print(now) # 2017-05-03 17:46:44.558754two_days = timedelta(2)in_two_days = now + two_daysprint(in_two_days) # 2017-05-05 17:46:44.558754 |
Или узнаем, сколько было времени 10 часов 15 минут назад, то есть фактически нам надо вычесть из текущего времени 10 часов и 15 минут:
| 1 2 3 4 5 | 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() возвращает общее количество секунд, куда входят и дни, и собственно секунды, и микросекунды.
Например, узнаем какой временной период между двумя датами:
| 1 2 3 4 5 6 7 8 9 10 | from datetime import timedelta, datetime now = datetime.now()twenty_two_may = datetime(2017, 5, 22)period = twenty_two_may - nowprint("{} дней {} секунд {} микросекунд".format(period.days, period.seconds, period.microseconds))# 18 дней 17537 секунд 72765 микросекундprint("Всего: {} секунд".format(period.total_seconds()))# Всего: 1572737.072765 секунд |
Сравнение дат
Также как и строки и числа, даты можно сравнивать с помощью стандартных операторов сравнения:
| 1 2 3 4 5 6 7 8 9 10 11 | from datetime import datetimenow = 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 - nowprint("Осталось {} дней".format(period.days)) |