Python: уроки, справочник и задачи

Python 3 datetime: работа с датой и временем

Раздел: Модули и библиотеки Python · Обновлено 31.10.2026

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

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

Python 3 datetime: работа с датой и временем
Фото: Rijksmuseum / CC0, Wikimedia Commons
Содержание статьи
  1. Пример 1.Получение текущей даты и времени Python
  2. Пример 2. Получить текущую дату python
  3. Пример 3. Получение текущей даты Python
  4. Пример 4. Сегодняшний год месяц и день
  5. Пример 5. Текущий час, минута, секунды и миллисекунды
  6. Пример 6. Разница между двумя датами и временем
  7. Пример 7. Продолжительность времени в секундах
  8. Формат получения даты
  9. Пример 8. Форматирование даты с помощью strftime
  10. Пример 9. strptime()
  11. Обработка часового пояса
  12. Методы модуля datetime в Python
  13. Часовые пояса через zoneinfo
  14. ISO-строки и Unix timestamp
  15. Сравнение классов модуля
  16. Частые вопросы
    1. Чем datetime.now() отличается от datetime.today()?
    2. Как убрать микросекунды из вывода?
    3. Как вывести название месяца по-русски?
    4. Как посчитать возраст или количество дней до даты?

Прежде чем мы окунемся в пучину знаний, создадим пару простеньких программ работающих с датой и временем.

Пример 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().

Подробнее о функции 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фиксированное смещение от UTCtimezone(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, если день рождения в этом году еще не наступил.