Перейти до вмісту

Токени формату дати

Є дві широко використовувані сімейства рядків формату дати й вони перекриваються досить, щоб бути небезпечними. 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
%GYYYYРік нумерації тижня ISOВідрізняється від календарного року приблизно Новий рік. Використовуйте лише з номером тижня 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
%sMarca часу Unix — секунди з 1970-01-01 UTC1773065107

Часовий пояс

3

Зміщення — число; назва зони — правило. Лише назва виживає зміну DST.

strftimeLDMLПолеРендерується як
%zZZЗміщення UTC, без двокрапки+0000
%:zXXXЗміщення UTC з двокрапкою, як ISO 8601 потребує+00:00
%ZzzzАбревіатура часового поясуАбревіатури не унікальні — CST — щонайменше три різні зони.UTC

Загальні комбінації

7

Вибудовані із токенів вище — без бібліотеки не потрібно.

strftimeLDMLПолеРендерується як
%Fyyyy-MM-ddISO дата2026-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. Він правильно сортується як текст, він однозначний щодо зміщення, і кожна мова його розбирає. Зберігайте це й форматуйте для дисплея в останній можливий момент; збережена локальна дата без зміщення — це невіднайманна втрата інформації.