Модуль Python Datetime
Модуль Datetime позволяет нам работать с объектами даты и времени. Он предоставляет три дополнительных типа данных: date, time и datetime.
import datetime
date()
datetime.date(year: int, month: int, day: int)
Метод date возвращает объект date с атрибутами year, month и day:
from datetime import date
# Создать объект date
obj = date(2022, 12, 1)
# Доступ к атрибуту year
obj.year
2022
obj.month
12
obj.day
1
time()
datetime.time(hour: int, minute: int, second: int)
Метод time возвращает объект time с атрибутами hour, minute, second, microsecond и tzinfo:
from datetime import time
# Создать объект time
obj = time(10, 20, 33)
# Доступ к атрибуту hour
obj.hour
10
obj.second
33
obj.microsecond
0
datetime()
datetime.datetime(year, month, day, hour, minute, second)
datetime возвращает объект, содержащий атрибуты как date, так и time:
from datetime import datetime
# Создать объект datetime с датой и временем
obj = datetime(2024, 12, 1, 15, 35, 59)
# Доступ к атрибуту year
obj.year
2024
obj.month
12
obj.day
1
obj.hour
15
obj.second
59
now() и today()
Методы now и today возвращают объект datetime с точным системным днем и временем:
from datetime import datetime
# Получить текущую дату и время
now = datetime.now()
now
datetime.datetime(2022, 7, 23, 19, 56, 49, 589806)
Поскольку возвращаемый объект является datetime, мы можем получить доступ как к атрибутам date, так и к time:
now.date()
datetime.date(2022, 7, 23)
now.time()
datetime.time(19, 56, 49, 589806)
now.year
2022
now.month
7
now.day
23
now.hour
19
now.minute
56
now.second
49
now.microsecond
589806
Кроме того, now может принимать объект timezone в качестве необязательного параметра:
from datetime import datetime, timezone
# Получить текущее время UTC
datetime.now(timezone.utc)
datetime.datetime(2022, 7, 24, 0, 20, 8, 265634, tzinfo=datetime.timezone.utc)
Если параметр timezone не указан, now по умолчанию использует системный часовой пояс.
strftime() и strptime()
Вы можете легко преобразовывать строки в объекты datetime и обратно с помощью методов strftime и strptime.
strftime()
strftime позволяет нам создавать отформатированные для человека строки из объекта Python datetime:
from datetime import datetime
# Получить текущую дату и время для примеров форматирования
now = datetime.now()
now
datetime.datetime(2022, 7, 23, 20, 31, 19, 751479)
# Форматировать datetime как день-месяц-год с сокращенным месяцем
now.strftime("%d-%b-%Y")
'23-Jul-2022'
# Форматировать datetime как день-месяц-год с числовым месяцем
now.strftime("%d-%m-%Y")
'23-07-2022'
# Форматировать datetime как месяц/день/год
now.strftime("%m/%d/%Y")
'07/23/2022'
# Форматировать datetime с датой и временем
now.strftime("%b/%d/%Y - %H:%M:%S")
'Jul/23/2022 - 20:31:19'
Строки, передаваемые в strftime, могут показаться немного странными, но их значение довольно легко понять. Например, %m/%d/%Y вернет месяц, день и год, разделенные / (07/23/2022).
strptime()
Метод strptime создает объект datetime из строки.
Этот метод принимает два параметра:
obj.strptime(datetime_string, format)
- Строка, представляющая объект datetime.
- Эквивалентный этой строке код формата Python.
from datetime import datetime
# Разобрать строку в объект datetime
datetime_str = '12-Jul-2023'
datetime.strptime(datetime_str, '%d-%b-%Y')
datetime.datetime(2023, 7, 12, 0, 0)
# Разобрать строку с датой и временем
datetime_str = 'Jul/12/2023 - 14:38:37'
datetime.strptime(datetime_str, "%b/%d/%Y - %H:%M:%S")
datetime.datetime(2023, 7, 12, 14, 38, 37)
Коды Формата
| Директива | Значение | Пример |
|---|---|---|
%a | Сокращенное название дня недели по локали. | Sun, Mon, …, Sat (en_US) |
%A | Полное название дня недели по локали. | Sunday, Monday, …, Saturday (en_US) |
%w | День недели в виде десятичного числа, где 0 — воскресенье, а 6 — суббота. | 0, 1, …, 6 |
%d | День месяца в виде десятичного числа с заполнением нулями слева. | 01, 02, …, 31 |
%b | Сокращенное название месяца по локали. | Jan, Feb, …, Dec (en_US) |
%B | Полное название месяца по локали. | January, February, …, December (en_US) |
%m | Месяц в виде десятичного числа с заполнением нулями слева. | 01, 02, …, 12 |
%y | Год без века в виде десятичного числа с заполнением нулями слева. | 00, 01, …, 99 |
%Y | Год с веком в виде десятичного числа. | 0001, 0002, …, 2013, 2014, …, 9998, 9999 |
%H | Час (24-часовой формат) в виде десятичного числа с заполнением нулями слева. | 00, 01, …, 23 |
%I | Час (12-часовой формат) в виде десятичного числа с заполнением нулями слева. | 01, 02, …, 12 |
%p | Эквивалент AM или PM по локали. | AM, PM (en_US) |
%M | Минута в виде десятичного числа с заполнением нулями слева. | 00, 01, …, 59 |
%S | Секунда в виде десятичного числа с заполнением нулями слева. | 00, 01, …, 59 |
%f | Микросекунда в виде десятичного числа, с заполнением нулями слева. | 000000, 000001, …, 999999 |
%z | Смещение UTC в формате ±HHMM[SS[.ffffff]] (пустая строка, если объект “наивный”). | (пусто), +0000, -0400, +1030, +063415, -030712.345216 |
%Z | Название часового пояса (пустая строка, если объект “наивный”). | (пусто), UTC, GMT |
%j | День года в виде десятичного числа с заполнением нулями слева. | 001, 002, …, 366 |
%U | Номер недели в году (воскресенье как первый день недели) в виде десятичного числа с заполнением нулями слева. Все дни в новом году, предшествующие первому воскресенью, считаются неделей 0. | 00, 01, …, 53 |
%W | Номер недели в году (понедельник как первый день недели) в виде десятичного числа. Все дни в новом году, предшествующие первому понедельнику, считаются неделей 0. | 00, 01, …, 53 |
%c | Соответствующее представление даты и времени по локали. | Tue Aug 16 21:30:00 1988 (en_US) |
%x | Соответствующее представление даты по локали. | 08/16/88 (None) |
%X | Соответствующее представление времени по локали. | 21:30:00 (en_US) |
%% | Буквальный символ '%'. | % |
timedelta()
Объект timedelta представляет разницу между двумя датами или временами.
from datetime import datetime
# Создать два объекта datetime
date_1 = datetime.strptime('12-Jul-2023', '%d-%b-%Y')
date_2 = datetime.strptime('01-Jan-2024', '%d-%b-%Y')
# Вычислить разницу (возвращает timedelta)
difference = date_2 - date_1
difference
datetime.timedelta(days=173)
# Получить количество дней из timedelta
difference.days
173
timedelta может добавлять days, seconds и microseconds к объекту datetime:
from datetime import datetime, timedelta
# Получить текущую дату и время для операций с timedelta
now = datetime.now()
now
datetime.datetime(2022, 7, 23, 21, 25, 2, 341081)
# Добавить 10 дней и 15 секунд к текущей дате и времени
now + timedelta(days=10, seconds=15)
datetime.datetime(2022, 8, 2, 21, 25, 17, 341081)
И может вычитать days, seconds и microseconds из объекта datetime:
from datetime import datetime, timedelta
# Получить текущую дату и время для примера вычитания
now = datetime.now()
now
datetime.datetime(2022, 7, 23, 21, 25, 2, 341081)
# Вычесть 10 дней и 15 секунд из текущей даты и времени
now - timedelta(days=10, seconds=15)
datetime.datetime(2022, 7, 13, 21, 59, 41, 100883)