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

Токены форматирования даты

Есть два широко используемых семейства строк формата даты, и они перекрываются достаточно, чтобы быть опасными. strftime — из C и унаследованной Python, Ruby, PHP и GNU date — использует токены процентов, такие как %Y. Unicode LDML, используемый ICU, Java, moment и dayjs, использует повторяющиеся буквы, такие как yyyy. В LDML MM — это месяц, а mm — это минута; переворачивание этой пары — это классическая ошибка.

Каждая строка ниже отрендерена для одного и того же момента: понедельник, 9 марта 2026 года, 14:05:07 UTC. Эта дата выбрана так, чтобы ничего не было скрыто — однозначный день и месяц выявляют нулевое заполнение, послеполуденный час делает часы на 12 и 24 часов видимо отличными, а день недели неоднозначен.

Пустой столбец эквивалента означает, что другой диалект не имеет единого токена для этого, и вы должны составить значение самостоятельно. Набор тестов отображает поля календаря с собственными функциями даты платформы и сравнивает их с этой таблицей, поэтому примеры не могут отклоняться от реальности.

Год

4
strftimeLDMLПолеОтображается как
%YyyyyЧетырёхзначный год2026
%yyyДвузначный годНеоднозначно по конструкции. Избегайте его в чём-либо сохранённом.26
%CВек — год разделён на 10020
%GYYYYISO год по неделям нумерацииОтличается от календарного года около Нового года. Используйте только с номером недели ISO.2026

Месяц

4

В LDML MM — месяц, а mm — минута.

strftimeLDMLПолеОтображается как
%mMMМесяц, нулевой отступ03
%-mMМесяц, без заполнения3
%bMMMСокращённое имя месяцаMar
%BMMMMПолное имя месяцаMarch

День и день недели

8

В LDML dd — день месяца, а DDD — день года.

strftimeLDMLПолеОтображается как
%dddДень месяца, нулевой отступ09
%-ddДень месяца, без заполнения9
%eДень месяца, пространство отступ 9
%jDDDДень года, 001–366068
%aEEEСокращённое имя дня неделиMon
%AEEEEПолное имя дня неделиMonday
%uДень недели как число, понедельник — это 1%w числит те же дни с воскресенья как 0.1
%VwwНомер недели ISO, недели, начинающиеся в понедельник11

Время

8
strftimeLDMLПолеОтображается как
%HHHЧас на 24-часовом клавиатуре14
%-HHЧас, без заполнения14
%IhhЧас на 12-часовом клавиатуре02
%MmmМинута05
%SssВторой07
%3NSSSМиллисекунды000
%paAM или PMPM
%sМетка времени Unix — секунды с 1970-01-01 UTC1773065107

Часовой пояс

3

Смещение — это число; имя зоны — это правило. Только имя выживает изменение DST.

strftimeLDMLПолеОтображается как
%zZZСмещение UTC без двоеточия+0000
%:zXXXСмещение UTC с двоеточием, как ISO 8601 хочет+00:00
%ZzzzАббревиатура часового поясаАббревиатуры не уникальны — CST как минимум три разные зоны.UTC

Распространённые комбинации

7

Построено из токенов выше — не требуется библиотека.

strftimeLDMLПолеОтображается как
%Fyyyy-MM-ddДата ISO2026-03-09
%THH:mm:ss24-часовое время14:05:07
%FT%T%:zyyyy-MM-dd'T'HH:mm:ssXXXПолная метка времени ISO 8601Формат для хранения. Сортируется как текст, однозначно о смещении.2026-03-09T14:05:07+00:00
%a, %d %b %Y %T %zEEE, dd MMM yyyy HH:mm:ss ZZRFC 2822 — заголовки электронной почты и старый HTTPMon, 09 Mar 2026 14:05:07 +0000
%m/%d/%YMM/dd/yyyyСоглашение США, месяц первый03/09/2026
%d.%m.%Ydd.MM.yyyyЕвропейское соглашение, день первый09.03.2026
%%''Буквальный знак процента%

FAQ

В чём разница между yyyy и YYYY?
В LDML yyyy — это календарный год, а YYYY — это ISO-номер года по неделям. Они отличаются на несколько дней в начале каждого января: 2027-01-01 приходится на неделю ISO 53 2026 года, поэтому YYYY читает там 2026. Случайное использование YYYY производит ошибку, которая появляется один раз в год, а затем исчезает, что делает её очень сложной для отлова.
Почему мой месяц показывается как минуты?
Потому что вы находитесь в диалекте LDML и использовали mm вместо MM. LDML чувствителен к регистру: M — месяц, m — минута, D — день года, d — день месяца. strftime имеет одну и ту же ловушку в другом месте — %M — это минуты, а %m — месяц.
Как получить отформатированное или неотформатированное число?
В strftime расширение GNU %-d удаляет заполнение, поэтому %d — это 09, а %-d — это 9. В LDML количество букв устанавливает ширину напрямую: d — это 9, а dd — это 09. Ни один не переносим — %-d не существует на каждой платформе.
Какой формат мне следует использовать для сохранения дат?
ISO 8601 с явным смещением — 2026-03-09T14:05:07+00:00. Это правильно сортируется как текст, это однозначно о смещении, и каждый язык его разбирает. Сохраняйте это и форматируйте для отображения в последний возможный момент; сохранённая локальная дата без смещения — это невозвратная потеря информации.