Коды форматирования 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–23 | 14 |
| %I | часы, 01–12 | 02 |
| %p | AM или PM | PM |
| %M | минуты, 00–59 | 30 |
| %S | секунды, 00–59 | 45 |
| %f | микросекунды, шесть цифр | 000000 |
| %j | день года, 001–366 | 294 |
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.
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.
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 — с понедельника, и для одной и той же даты числа могут отличаться.
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-го года.
from datetime import date
d = date(2027, 1, 1)
year, week, weekday = d.isocalendar()
print(d.year)
print(year, week)
2027 2026 53
Собирать шаблон из кусков
Когда один и тот же формат нужен в нескольких местах — в подписи и в имени файла, например, — его удобно собирать из кусков. Дата и время живут отдельными константами, а полная строка получается их склейкой. Это не изобретение: так же устроены ISO-форматы в большинстве языков, и тот же приём пригодится, когда формат нужно немного менять в зависимости от контекста.
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, в более старых версиях знак иногда молча пропадал, в зависимости от системы. Случается это нечасто, но в отчётах со скидками и процентами — регулярно, и ошибка прилетает уже на проде.
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'))
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. Что произойдёт при попытке напечатать процент в шаблоне?
Возьмите дату datetime(2026, 3, 8, 9, 5, 3) и выведите три строки: дату в виде 08.03.2026, время в виде 09:05 и год двумя последними цифрами.
Какие коды форматирования даты есть в 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-канал или свой блог — так о проекте узнают новые читатели.
Что дальше
Осталось в разделе: 20 из 20. Прогресс хранится в вашем браузере.
Что читать дальше
Datetime · Урок 7
Сравнение и сортировка дат
Даты сравниваются как числа — и потому сортируются, выбираются min и max и становятся ключами словаря. Разбираем операторы и честную сортировку без строковых сюрпризов.
Datetime · Урок 9
Русские месяцы: названия дат словами
%B упрямо выводит October: названия месяцев strftime берёт из локали среды. Делаем словарь RU_MONTHS и печатаем «21 октября 2026» без единой локали.
Похожие уроки по темам
Подобраны автоматически по пересечению тем и ключевых слов.
openpyxl · Урок 9
Даты в Excel через openpyxl: запись, формат и арифметика
Пишем в ячейку настоящий datetime, показываем его по-русски маской DD.MM.YYYY и считаем дни между датами — а заодно узнаём, почему дату из файла нельзя сравнивать со строкой.
openpyxl датыopenpyxl дата в ячейке
Строки · Урок 12
format() и старый процент: история форматирования
До f-строк текст собирали методом format, а до него — процентом. Эти способы живы в миллионах строк чужого кода: учимся читать их свободно и понимать, почему f-строки победили.
форматирование строк pythonpython формат строки
Datetime · Урок 4
strftime: дата превращается в строку
Объект даты хорош для вычислений, а человеку нужна строка «21.10.2026». Один метод strftime и горстка кодов — и дата принимает любой вид.
strftime pythonpython strftime формат