Перейти к содержанию

412 уроков, 25 библиотек и челлендж «Что выведет код?» — бесплатно, код прямо в браузере

Начать обучение
Урок 8 из 20 Начальный 20 мин 130 XP

Коды форматирования strftime: полная шпаргалка

strftime превращает datetime в строку по шаблону из кодов: %Y — год, %m — месяц, %H — часы. Собираем полную шпаргалку с примерами вывода на одной фиксированной дате.

Редакция Питоники

Объект datetime удобен коду: из него достаются month и hour, он сравнивается и вычитается. Человеку же нужна строка — «21.10.2026 14:30» на экране, в письме, в имени файла. Для превращения datetime в строку у него есть метод strftime: он получает шаблон, собранный из кодов, и каждый код начинается с процента. Это полная шпаргалка по кодам форматирования — вернитесь к ней, когда в очередной раз забудется, чем %m отличается от %M.

дата по шаблону
from datetime import datetime

d = datetime(2026, 10, 21, 14, 30, 45)
print(d.strftime('%d.%m.%Y %H:%M'))
print(d.strftime('%A, %d %B'))
Вывод
21.10.2026 14:30
Wednesday, 21 October

Метод читается как string format time: он получает шаблон и возвращает строку, где каждый код заменён своей частью даты. %d — день, %m — месяц, %Y — год, %H и %M — часы и минуты. Всё остальное — точки, пробелы, запятые, любые буквы — остаётся в строке как написано: шаблон '%A, %d %B' дал Wednesday, 21 October именно потому, что запятая с пробелами — не коды. Заметьте: %A и %B вывели английские названия. Откуда они берутся и как получить русские — отдельная история, ей посвящён урок про русские даты.

Полная таблица кодов

Все примеры сняты с одной подопытной даты — datetime(2026, 10, 21, 14, 30, 45), это среда, объект без микросекунд. От содержимого объекта зависят два кода: %f выводит микросекунды шестью цифрами, и у объекта без них получится 000000; %j — номер дня в году, у 21 октября 2026-го это 294-й день.

КодЧто выводитНа подопытной дате
%Yгод, четыре цифры2026
%yгод, две последние цифры26
%mномер месяца, с ведущим нулём10
%dдень месяца, с ведущим нулём21
%Bполное имя месяцаOctober
%bсокращённое имя месяцаOct
%Aполное имя дня неделиWednesday
%aсокращённое имя дня неделиWed
%Hчасы, 00–2314
%Iчасы, 01–1202
%pAM или PMPM
%Mминуты, 00–5930
%Sсекунды, 00–5945
%fмикросекунды, шесть цифр000000
%jдень года, 001–366294
те же коды в цикле
from datetime import datetime

d = datetime(2026, 10, 21, 14, 30, 45)
codes = ['%Y', '%y', '%m', '%d', '%H', '%M', '%S']
for c in codes:
    print(c, '->', d.strftime(c))
Вывод
%Y -> 2026
%y -> 26
%m -> 10
%d -> 21
%H -> 14
%M -> 30
%S -> 45

Код %m выводит месяц, а %M — минуты: регистр один, а значения разные. Это самая частая опечатка в strftime, и она не вызывает ни ошибки, ни предупреждения: шаблон '%m:%d' честно напечатает 10:21 там, где ждали минуты с часами. Программа работает, дата — неправильная, а заметят это обычно уже на проде. Родственная оговорка про то, как вывести день недели текстом, — в уроке про weekday.

%m и %M на одной дате
from datetime import datetime

d = datetime(2026, 10, 21, 14, 30)
print(d.strftime('%m'))
print(d.strftime('%M'))
Вывод
10
30

Отдельная пара — %H и %I: первый выводит часы в 24-часовом формате от 00 до 23, второй — в 12-часовом от 01 до 12. Код %I обычно идёт в паре с %p, который добавляет обозначение AM или PM: без него 02:30 не понять, утро это или день. Четырнадцать часов тридцать минут в 12-часовой записи — это 02:30 PM.

12-часовой формат
from datetime import datetime

d = datetime(2026, 10, 21, 14, 30, 45)
print(d.strftime('%I:%M %p'))
Вывод
02:30 PM

Коды за пределами даты: неделя, год, эпоха

В таблице выше лежат коды, которыми пользуются постоянно. Но есть ещё несколько, и они закрывают задачи, которые регулярно всплывают в отчётности. День года %j нужен для нумерации страниц отчёта и для расчёта «прошло ли столько-то дней с начала года». Коды недели %U и %W считают недели по-разному: %U начинает неделю с воскресенья, %W — с понедельника, и для одной и той же даты числа могут отличаться.

week.py — день года и неделя
from datetime import datetime

d = datetime(2026, 10, 21, 14, 30)

print(d.strftime('%j'))
print(d.strftime('%U'))
print(d.strftime('%W'))
print(d.strftime('%G'))
print(d.strftime('%V'))
Вывод
294
42
42
2026
43

Коды %G и %V — это ISO-версия: %G даёт год по стандарту ISO 8601, а %V — номер недели в нём. Именно из-за ISO тут возникает неочевидная вещь: новый календарный год может начаться внутри старой недели. Первое января 2027 года ISO считает 53-й неделю 2026-го года.

iso_year.py — год и неделя по ISO
from datetime import date

d = date(2027, 1, 1)
year, week, weekday = d.isocalendar()

print(d.year)
print(year, week)
Вывод
2027
2026 53

Собирать шаблон из кусков

Когда один и тот же формат нужен в нескольких местах — в подписи и в имени файла, например, — его удобно собирать из кусков. Дата и время живут отдельными константами, а полная строка получается их склейкой. Это не изобретение: так же устроены ISO-форматы в большинстве языков, и тот же приём пригодится, когда формат нужно немного менять в зависимости от контекста.

compose.py — шаблон из двух констант
from datetime import datetime

DATE_FORMAT = '%d.%m.%Y'
TIME_FORMAT = '%H:%M'

moment = datetime(2026, 10, 21, 14, 30)
print(moment.strftime(DATE_FORMAT + ' ' + TIME_FORMAT))
Вывод
21.10.2026 14:30

И последнее про проценты. В шаблоне strftime символ % означает начало кода, поэтому процент в обычном тексте удваивается: 'скидка %d%%' напечатает «скидка 21%». Одинокий % в конце шаблона — ошибка: в Python 3.13 и новее это ValueError: Invalid format string, в более старых версиях знак иногда молча пропадал, в зависимости от системы. Случается это нечасто, но в отчётах со скидками и процентами — регулярно, и ошибка прилетает уже на проде.

percent.py — процент в тексте шаблона
from datetime import datetime

moment = datetime(2026, 10, 21)

print(moment.strftime('скидка %d%%'))
print(moment.strftime('скидка %d%% на всё'))
Вывод
скидка 21%
скидка 21% на всё

Шпаргалка по кодам полезна ровно до того момента, когда вы перестаёте в неё заглядывать: пара «%m — месяц, %M — минуты» запоминается за час и ошибается в одном проекте за всю жизнь.

Что выведет код?

Сначала предскажи ответ в голове — это главный навык программиста.

from datetime import datetime

d = datetime(2026, 10, 21, 14, 30, 45)
print(d.strftime('%d.%m.%Y'))
from datetime import datetime

d = datetime(2026, 10, 21, 14, 30)
print(d.strftime('%H:%M'))
from datetime import datetime

print(datetime(2026, 10, 21).strftime('%y-%m'))
from datetime import datetime

d = datetime(2026, 10, 21, 14, 30)
print(d.strftime('%j'))
print(d.strftime('%V'))
Проверь себя
0 / 8

1. Что выведет datetime(2026, 10, 21).strftime('%d.%m.%Y')?

2. Какой код strftime выводит минуты?

3. Что вернёт strftime('%I:%M %p') для 14:30?

4. Что выведет код %f у datetime без микросекунд?

5. Почему %B дало October, а не «октября»?

6. Что выведет код %j у даты 21 октября 2026 года?

7. Чем %U отличается от %W?

8. Что произойдёт при попытке напечатать процент в шаблоне?

Карточки терминов
Запомнено: 0 / 9
Практика

Возьмите дату datetime(2026, 3, 8, 9, 5, 3) и выведите три строки: дату в виде 08.03.2026, время в виде 09:05 и год двумя последними цифрами.

practice.py
Вопросы и ответы по уроку

Какие коды форматирования даты есть в Python?

Основные коды strftime: %Y и %y — год, %m — номер месяца, %d — день месяца, %B и %b — имя месяца, %A и %a — день недели, %H и %I — часы в 24- и 12-часовом формате, %p — AM/PM, %M — минуты, %S — секунды, %f — микросекунды, %j — день года. Все примеры вывода — в таблице этого урока.

Чем отличается %m от %M в strftime?

Регистром: %m выводит номер месяца (для октября — 10), а %M — минуты (для 14:30 — 30). Перепутанный код не вызывает ошибки и не ломает программу — дата просто напечатается неправильно, поэтому пару %m/%M стоит проверять в первую очередь.

Урок 9: русские даты

Как вывести дату в формате ДД.ММ.ГГГГ?

Шаблоном '%d.%m.%Y': d.strftime('%d.%m.%Y') для 21 октября 2026 года вернёт 21.10.2026. Точки — часть шаблона, вместо них можно поставить любые разделители: дефисы, пробелы или слэши.

Почему strftime выводит месяцы по-английски?

Названия месяцев и дней strftime берёт из локали операционной системы, а по умолчанию действует английская C-локаль. Переключать локаль ради дат не стоит — она глобальна и зависит от машины. Надёжный способ — свой словарь месяцев, им занимается следующий урок.

Урок 9: русские даты

Как узнать номер дня в году и номер недели?

Кодами %j (день года от 001 до 366), %U и %W (недели с воскресенья и с понедельника) либо %V с %G — это неделя и год по ISO-8601. Для программной работы удобнее метод isocalendar(): он отдаёт кортеж (год, неделя, день) сразу и без строк.

Почему нельзя хранить только номер недели?

Потому что неделя 1 следующего года наступает раньше недели 52 этого. Храните пару «год + неделя»: у даты 1 января 2027 года ISO-год равен 2026, а неделя — 53. Именно это и отдаёт isocalendar().

Что делать, если в шаблоне нужен знак процента?

Удвоить его: 'скидка %d%%' напечатает «скидка 21%». Одинокий % в конце шаблона — ошибка: в Python 3.13 и новее это ValueError: Invalid format string, в более старых версиях знак мог пропасть молча. Правило не менялось: любой процент в шаблоне удваивается.

Понравился урок? Сошлитесь на него

«Код %m выводит месяц, а %M — минуты: регистр один, а значения разные.»

Скопируйте готовую ссылку в формате HTML, Markdown или чистый адрес и вставьте в статью на Habr, VC, Telegram-канал или свой блог — так о проекте узнают новые читатели.

TelegramVK

Что дальше

Осталось в разделе: 20 из 20. Прогресс хранится в вашем браузере.

Похожие уроки по темам

Подобраны автоматически по пересечению тем и ключевых слов.