Python 3 datetime: работа с датой и временем
Модуль datetime в Python 3 входит в стандартную библиотеку и отвечает за даты, время и интервалы между ними. Ниже на коротких примерах показано, как получить текущую дату, достать год или час, посчитать разницу через timedelta, перевести дату в строку и обратно и учесть часовой пояс.
В этом цикле уроков, мы с вами научимся управлять датой и временем в Python. Модуль datetime отвечает за управление временем в Python. На практических примерах, вы поймете, что это довольно просто. Приступаем к практике.

Содержание статьи
- Пример 1.Получение текущей даты и времени Python
- Пример 2. Получить текущую дату python
- Пример 3. Получение текущей даты Python
- Пример 4. Сегодняшний год месяц и день
- Пример 5. Текущий час, минута, секунды и миллисекунды
- Пример 6. Разница между двумя датами и временем
- Пример 7. Продолжительность времени в секундах
- Формат получения даты
- Пример 8. Форматирование даты с помощью strftime
- Пример 9. strptime()
- Обработка часового пояса
- Методы модуля datetime в Python
- Часовые пояса через zoneinfo
- ISO-строки и Unix timestamp
- Сравнение классов модуля
- Частые вопросы
Прежде чем мы окунемся в пучину знаний, создадим пару простеньких программ работающих с датой и временем.
Пример 1.Получение текущей даты и времени Python
import datetime
datetime_now = datetime.datetime.now()
print(datetime_now)
Результат:
2018-05-19 09:26:03.478039
Импортируем модуль datetime с помощью import datetime. Затем вызываем метод now() модуля datetime, для получения текущей даты и времени.
Пример 2. Получить текущую дату python
import datetime
date_now= datetime.date.today()
print(date_now)
В этом примере мы используем метод today() из класса date, что бы получить текущую дату.
Пример 3. Получение текущей даты Python
Мы можем создать объект date, содержащий текущую дату используя метод класса today().
from datetime import date
today = date.today()
print("Текущая дата =", today)
Пример 4. Сегодняшний год месяц и день
Следующий код покажет нам, как легко получить текущий год, месяц, день недели и.т.д.
from datetime import date
today = date.today()
print("Текущий год:", today.year)
print("Текущий месяц:", today.month)
print("Текущий день:", today.day)
Результат:
Текущий год: 2021
Текущий месяц: 6
Текущий день: 10
Пример 5. Текущий час, минута, секунды и миллисекунды
Создаем объект time, и получаем его атрибуты. Обращаю ваше внимание, что мы не передаем microsecond, поэтому его значение будет 0.
from datetime import time
a = time(11, 34, 56)
print("Час=", a.hour)
print("Минута=", a.minute)
print("Секунда=", a.second)
print("Микросекунда=", a.microsecond)
Результат:
Час= 11
Минута= 34
Секунда= 56
Микросекунда= 0
Пример 6. Разница между двумя датами и временем
timedelta - объект возвращает разницу между двумя датами.
from datetime import datetime, date
t1 = date(year = 2018, month = 7, day = 12)
t2 = date(year = 2017, month = 12, day = 23)
t3 = t1 - t2
print("t3 =", t3)
t4 = datetime(year = 2018, month = 7, day = 12, hour = 7, minute = 9, second = 33)
t5 = datetime(year = 2019, month = 6, day = 10, hour = 5, minute = 55, second = 13)
t6 = t4 - t5
print("t6 =", t6)
print("type of t3 =", type(t3))
print("type of t6 =", type(t6))
Результат:t3 = 201 days, 0:00:00
t6 = -333 days, 1:14:20
type of t3 = <class 'datetime.timedelta'>
type of t6 = <class 'datetime.timedelta'>
Пример 7. Продолжительность времени в секундах
Получаем общее количество секунд в объекте timedelta с помощью функции total_seconds().
from datetime import timedelta
t = timedelta(days = 5, hours = 1, seconds = 33, microseconds = 233423)
print("Всего секунд =", t.total_seconds())
Результат:
Всего секунд = 435633.233423
Мы так же можем найти сумму двух дат с помощью оператора +. По мимо этого, мы можем так же делить и умножать объект timedelta на целые и дробные числа.
Формат получения даты
Я думаю вы отлично понимаете, что в разных странах разный формат даты и времени. Если наиболее распространенным форматом в России является dd/mm/yyyy то например в США mm/dd/yyyy.
Для обработки формата даты, в Python используются функции strftime() и strptime().
Пример 8. Форматирование даты с помощью strftime
from datetime import datetime
# Текущая дата и время
now = datetime.now()
t = now.strftime("%H:%M:%S")
print("Время:", t)
s1 = now.strftime("%m/%d/%Y, %H:%M:%S")
print("s1:", s1)
s2 = now.strftime("%d/%m/%Y, %H:%M:%S")
print("s2:", s2)
Результат:
Время: 04:34:52
s1: 06/09/2021, 04:34:52
s2: 09/06/2021, 04:34:52
И так, тут у нас ситуация складывается следующим образом. %Y, %m,%d,%H являются кодом для форматирования strftime().
%Y - год [0001,....2010,2011,2012,....9999]- %m - месяц[01,02,03,...12]
- %d - день [01,02,03,...31]
- %H - час [00,01,02,03,...23]
- %M - минуты [00,01,02,...59]
- %S - секунда [00,01,02,03,....59]
Подробнее о функции strftime().
Пример 9. strptime()
from datetime import datetime
date_string = "21 June, 2018"
print("date_string =", date_string)
date_object = datetime.strptime(date_string, "%d %B, %Y")
print("date_object =", date_object)
Метод strptime() принимает в качестве аргумента строку, которая представляет дату и время. Но необходимо учитывать, что название месяца нужно указывать на английском языке. Подробнее о strptime().
Обработка часового пояса
Представим себе ситуацию, где вы пишите программу, в которой необходимо выводить дату и время в зависимости от часового пояса. Конечно, можно вручную указывать все эти данные, но вся красота Python заключается в том, что мы можем использовать уже готовые решения. В данном случае, воспользуемся сторонней библиотекой pytz.
from datetime import datetime
import pytz
local = datetime.now()
print("Local:", local.strftime("%m/%d/%Y, %H:%M:%S"))
tz_NY = pytz.timezone('America/New_York')
datetime_NY = datetime.now(tz_NY)
print("NY:", datetime_NY.strftime("%m/%d/%Y, %H:%M:%S"))
tz_London = pytz.timezone('Europe/London')
datetime_London = datetime.now(tz_London)
print("London:", datetime_London.strftime("%m/%d/%Y, %H:%M:%S"))
Результат:
Local: 12/20/2018, 13:10:44
NY: 12/20/2018, 05:10:44
London: 12/20/2018, 10:10:44
Методы модуля datetime в Python
| Методы | Описание |
| datetime.today() | Текущая дата и время |
| datetime.fromordinal(ordinal) | дата по порядковому номеру дня, где 1 соответствует 01.01.0001 |
| datetime.now | Текущая дата и время |
| datetime.combine | объект datetime из комбинации объектов date и time. |
| datetime.strptime | преобразует строку в datetime |
| datetime.strftime | преобразует datetime в строку по шаблону формата |
| datetime.date | объект даты (с отсечением времени). |
| datetime.time | объект времени (с отсечением даты) |
| datetime.replace | возвращает новый объект datetime с изменёнными атрибутами. |
| datetime.timetuple | возвращает struct_time из datetime |
| datetime.toordinal | порядковый номер дня, где 01.01.0001 имеет номер 1 |
| datetime.timestamp | возвращает время в секундах с начала эпохи. |
| datetime.weekday | день недели в виде числа, понедельник - 0, воскресенье - 6 |
| datetime.isoweekday | день недели в виде числа, понедельник - 1, воскресенье - 7 |
| datetime.isocalendar | кортеж (год в формате ISO, ISO номер недели, ISO день недели). |
| datetime.isoformat | красивая строка вида "YYYY-MM-DDTHH:MM:SS.mmmmmm" или, если microsecond == 0, "YYYY-MM-DDTHH:MM:SS" |
| datetime.ctime | строка вида "Mon Jun 10 05:55:13 2019" |
Часовые пояса через zoneinfo
Начиная с Python 3.9 часовые пояса можно обрабатывать без сторонних пакетов: модуль zoneinfo берет базу IANA из операционной системы. На Windows базы может не оказаться, тогда ее ставят командой pip install tzdata. Объект ZoneInfo передается прямо в datetime.now() или в параметр tzinfo.
from datetime import datetime, timezone
from zoneinfo import ZoneInfo
utc = datetime.now(timezone.utc)
msk = utc.astimezone(ZoneInfo('Europe/Moscow'))
ny = utc.astimezone(ZoneInfo('America/New_York'))
print(msk.strftime('%d.%m.%Y %H:%M %Z'))
print(ny.strftime('%d.%m.%Y %H:%M %Z'))Дата без часового пояса называется наивной (naive), с поясом - осведомленной (aware). Сравнивать и вычитать наивную и осведомленную даты нельзя, Python выбросит TypeError. В старом коде для той же задачи используют библиотеку pytz, но в новых проектах удобнее zoneinfo.
ISO-строки и Unix timestamp
Для обмена датами между программами и API обычно используют формат ISO 8601 или число секунд с 1 января 1970 года (UTC). Для обоих случаев в datetime есть готовые методы, без ручного шаблона формата.
from datetime import datetime, timezone
dt = datetime.fromisoformat('2025-03-08T14:30:00')
print(dt.isoformat()) # 2025-03-08T14:30:00
ts = 1_700_000_000
print(datetime.fromtimestamp(ts, tz=timezone.utc))
# 2023-11-14 22:13:20+00:00
print(int(dt.replace(tzinfo=timezone.utc).timestamp()))Метод timestamp() у наивной даты считает ее локальным временем компьютера, поэтому результат зависит от машины. Если дата хранится в UTC, сначала укажите пояс через replace(tzinfo=timezone.utc). Арифметика с интервалами подробно разобрана в статье про timedelta.
Сравнение классов модуля
Модуль содержит несколько классов, и для каждой задачи подходит свой.
| Класс | Что хранит | Пример создания |
|---|---|---|
date | год, месяц, день | date(2025, 3, 8) |
time | часы, минуты, секунды, микросекунды | time(14, 30) |
datetime | дату и время вместе | datetime(2025, 3, 8, 14, 30) |
timedelta | интервал: дни, секунды, микросекунды | timedelta(hours=5) |
timezone | фиксированное смещение от UTC | timezone(timedelta(hours=3)) |
Частые вопросы
Короткие ответы на вопросы, которые возникают при работе с датами.
Чем datetime.now() отличается от datetime.today()?
Без аргументов оба возвращают текущее локальное время. Разница в том, что now() принимает параметр tz и может сразу вернуть время в нужном поясе, а today() такого параметра не имеет.
Как убрать микросекунды из вывода?
Вызовите dt.replace(microsecond=0) или отформатируйте дату через strftime('%Y-%m-%d %H:%M:%S'). Еще один вариант: dt.isoformat(timespec='seconds').
Как вывести название месяца по-русски?
Коды %B и %A зависят от локали. Можно вызвать locale.setlocale(locale.LC_TIME, 'ru_RU.UTF-8'), но такая локаль есть не на всех системах, а месяц выйдет в именительном падеже. Надежнее держать свой список названий месяцев и брать элемент по dt.month - 1.
Как посчитать возраст или количество дней до даты?
Вычтите одну дату из другой: результат будет timedelta, а число дней лежит в атрибуте .days. Для возраста в годах сравните кортежи (month, day) двух дат и уменьшите разницу годов на 1, если день рождения в этом году еще не наступил.