Spec-Zone.ru › HTML

Использование форматов даты и времени в HTML

Определённые HTML-элементы используют значения даты и/или времени. Форматы строк, задающих эти значения, описаны в этой статье.

К элементам, использующим такие форматы, относятся определённые формы элемента <input>, позволяющие пользователю выбирать или указывать дату, время или и то, и другое, а также элементы <ins> и <del>, чей атрибут datetime указывает дату или дату и время добавления или удаления содержимого.

Для <input> значения type полей ввода, чей атрибут value содержит строку, представляющую дату и/или время, следующие:

  • date
  • datetime-local
  • month
  • time
  • week

Примеры

Прежде чем углубляться в тонкости того, как строки даты и времени записываются и анализируются в HTML, приведём несколько примеров, которые дадут представление о том, как выглядят наиболее часто используемые форматы строк даты и времени.

Примеры HTML-строк даты и времени
Строка Дата и/или время
2005-06-07 7 июня 2005 г. [подробнее]
08:45 8:45 AM [подробнее]
08:45:25 8:45 AM и 25 секунд [подробнее]
0033-08-04T03:40 3:40 AM 4 августа 33 г. [подробнее]
1977-04-01T14:00:30 30 секунд после 2:00 PM 1 апреля 1977 г. [подробнее]
1901-01-01T00:00Z Полночь UTC 1 января 1901 г. [подробнее]
1901-01-01T00:00:01-04:00 1 секунда после полуночи по восточному поясному времени (EST) 1 января 1901 г. [подробнее]

Основы

Прежде чем рассматривать различные форматы строк даты и времени, используемых в элементах HTML, полезно понять несколько фундаментальных фактов о том, как они определяются. В HTML для строк даты и времени используется вариация стандарта ISO 8601. Стоит ознакомиться с описаниями используемых вами форматов, чтобы убедиться, что ваши строки действительно совместимы с HTML, поскольку спецификация HTML включает алгоритмы синтаксического анализа этих строк, которые на самом деле точнее, чем ISO 8601, поэтому могут существовать тонкие различия в том, как должны выглядеть строки даты и времени.

Набор символов

Дата и время в HTML всегда представляют собой строки, использующие набор символов ASCII.

Номера годов

Чтобы упростить базовый формат строк даты в HTML, спецификация требует, чтобы все годы указывались с использованием современного (или пролептического) григорианского календаря. Хотя пользовательские интерфейсы могут разрешать ввод дат с использованием других календарей, базовое значение всегда использует григорианский календарь.

Хотя григорианский календарь появился только в 1582 году (заменив аналогичный юлианский календарь), для целей HTML григорианский календарь расширен назад до 1 года н. э. Убедитесь, что любые более ранние даты учитывают это.

Для дат в HTML год всегда состоит как минимум из четырёх цифр; годы до 1000 года дополняются ведущими нулями (0), поэтому 72 год записывается как 0072. Годы до 1 года н. э. не поддерживаются, поэтому HTML не поддерживает 1 год до н. э. или более ранние годы.

Обычно год состоит из 365 дней, за исключением високосных лет.

Високосные годы

Високосный год — это любой год, который делится на 400 или делится на 4, но не на 100. Хотя календарный год обычно длится 365 дней, планете Земля на самом деле требуется приблизительно 365,2422 дня для совершения одного оборота вокруг Солнца. Високосные годы помогают скорректировать календарь, чтобы синхронизировать его с фактическим положением планеты на орбите. Добавление дня к году каждые четыре года делает среднюю продолжительность года равной 365,25 дня, что близко к правильному значению.

Поправки в алгоритме (считать високосным год, который делится на 400, и пропускать високосные годы, когда год делится на 100) помогают приблизить среднее значение ещё ближе к правильному числу дней (365,2425 дня). Учёные время от времени добавляют секунды координации в календарь (на полном серьёзе), чтобы компенсировать оставшиеся три десятитысячные доли дня и постепенное естественное замедление вращения Земли.

В то время как месяц 02, февраль, обычно состоит из 28 дней, в високосные годы он содержит 29 дней.

Месяцы года

В году 12 месяцев, пронумерованных от 1 до 12. Они всегда представляются двухзначной ASCII-строкой со значением от 01 до 12. Номера месяцев и соответствующие им названия (а также продолжительность в днях) приведены в таблице в разделе Дни месяца.

Дни месяца

Месяцы под номерами 1, 3, 5, 7, 8, 10 и 12 имеют продолжительность 31 день. Месяцы 4, 6, 9 и 11 — 30 дней. Месяц 2, февраль, длится 28 дней в большинстве лет, но 29 дней в високосные годы. Подробно это показано в следующей таблице.

Месяцы года и их продолжительность в днях
Номер месяца Название Продолжительность в днях
01 Январь 31
02 Февраль 28 (29 в високосные годы)
03 Март 31
04 Апрель 30
05 Май 31
06 Июнь 30
07 Июль 31
08 Август 31
09 Сентябрь 30
10 Октябрь 31
11 Ноябрь 30
12 Декабрь 31

Строки недели

Строка недели задаёт неделю в пределах определённого года. Корректная строка недели состоит из корректного номера года, за которым следует дефис (- или U+002D), затем заглавная буква W (U+0057), за которой следует двузначное значение номера недели в году.

Номер недели в году — это двухзначная строка от 01 до 53. Каждая неделя начинается в понедельник и заканчивается в воскресенье. Это означает, что первые несколько дней января могут считаться частью предыдущего года по нумерации недель, а последние несколько дней декабря — частью следующего года. Первая неделя года — это неделя, которая содержит первый четверг года. Например, первый четверг 1953 года пришёлся на 1 января, поэтому эта неделя, начинающаяся в понедельник, 29 декабря, считается первой неделей года. Таким образом, 30 декабря 1952 года приходится на неделю 1953-W01.

Год содержит 53 недели, если:

  • Первый день календарного года (1 января) — четверг, или
  • Первый день года (1 января) — среда, и год является високосным

Все остальные годы состоят из 52 недель.

Строка недели Неделя и год (Диапазон дат)
2001-W37 Неделя 37, 2001 (10–16 сентября 2001 г.)
1953-W01 Неделя 1, 1953 (29 декабря 1952 – 4 января 1953 г.)
1948-W53 Неделя 53, 1948 (27 декабря 1948 – 2 января 1949 г.)
1949-W01 Неделя 1, 1949 (3–9 января 1949 г.)
0531-W16 Неделя 16, 531 (13–19 апреля 531 г.)
0042-W04 Неделя 4, 42 (21–27 января 42 г.)

Обратите внимание, что как номер года, так и номер недели дополняются ведущими нулями: год дополняется до четырёх цифр, а неделя — до двух.

Строки месяца

Строка месяца представляет определённый месяц во времени, а не просто месяц года. То есть вместо «января» строка месяца HTML представляет пару из месяца и года, например «январь 1972».

Корректная строка месяца состоит из корректного номера года (строки как минимум из четырёх цифр), за которым следует дефис (- или U+002D), а затем двухзначный числовой номер месяца, где 01 обозначает январь, а 12 — декабрь.

Строка месяца Месяц и год
17310-09 Сентябрь 17310 г.
2019-01 Январь 2019 г.
1993-11 Ноябрь 1993 г.
0571-04 Апрель 571 г.
0001-07 Июль 1 г. н. э.

Обратите внимание, что все годы состоят не менее чем из четырёх символов; годы, содержащие менее четырёх цифр, дополняются ведущими нулями.

Строки даты

Корректная строка даты состоит из строки месяца, за которой следует дефис (- или U+002D), а затем двузначный день месяца.

Строка даты Полная дата
1993-11-01 1 ноября 1993 г.
1066-10-14 14 октября 1066 г.
0571-04-22 22 апреля 571 г.
0062-02-05 5 февраля 62 г.

Строки времени

Строка времени может указывать время с точностью до минуты, секунды или миллисекунды. Указание только часа или только минут не допускается. Корректная строка времени как минимум состоит из двузначного значения часа, за которым следует двоеточие (:, U+003A), затем двузначное значение минут. После минут при необходимости может следовать ещё одно двоеточие и двузначное количество секунд. Миллисекунды могут быть указаны опционально путём добавления точки (., U+002E), за которой следуют одна, две или три цифры.

Существуют также некоторые дополнительные базовые правила:

  • Час всегда указывается в 24-часовом формате, где 00 обозначает полночь, а 23:00 (11 PM) — 23. Значения вне диапазона 00 – 23 не допускаются.
  • Минуты должны быть двузначным числом от 00 до 59. Значения вне этого диапазона не допускаются.
  • Если количество секунд опущено (для указания времени с точностью только до минут), после минут не должно быть двоеточия.
  • Если указана целая часть количества секунд, она должна быть в диапазоне от 00 до 59. Нельзя указывать секунды координации, используя значения вроде 60 или 61.
  • Если количество секунд указано и является целым числом, за ним не должна следовать точка.
  • Если указана дробная часть секунды, она может содержать от одной до трёх цифр, обозначающих количество миллисекунд. Она следует за точкой, расположенной после компонента секунд строки времени.
Строка времени Время
00:00:30.75 12:00:30.75 AM (30,75 секунды после полуночи)
12:15 12:15 PM
13:44:25 1:44:25 PM (25 секунд после 1:44 PM)

Строки локальной даты и времени

Корректная строка datetime-local состоит из строки date и строки time, объединённых вместе и разделённых буквой T или пробелом. Строка не содержит информации о часовом поясе; предполагается, что дата и время указаны в местном часовом поясе пользователя.

Когда вы задаёте атрибут value поля ввода datetime-local, строка нормализуется в стандартную форму. Нормализованные строки datetime всегда используют букву T для разделения даты и времени, а часть строки со временем делается максимально короткой. Это достигается за счёт пропуска компонента секунд, если его значение равно :00.

Примеры корректных строк datetime-local
Строка даты/времени Нормализованная строка даты/времени Фактические дата и время
1986-01-28T11:38:00.01 1986-01-28T11:38:00.01 28 января 1986 г. в 11:38:00.01 AM
1986-01-28 11:38:00.010

1986-01-28T11:38:00.01

Обратите внимание, что после нормализации это та же строка, что и предыдущая строка datetime-local. Пробел был заменён символом T, а конечный ноль в долях секунды удалён, чтобы сделать строку как можно короче.

28 января 1986 г. в 11:38:00.01 AM
0170-07-31T22:00:00

0170-07-31T22:00

Обратите внимание, что нормализованная форма этой даты отбрасывает :00, указывающие на нулевое количество секунд, поскольку секунды необязательны, если они равны нулю, а нормализованная строка минимизирует свою длину.

31 июля 170 г. в 10:00 PM

Строки глобальной даты и времени

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

Строка смещения часового пояса

Строка смещения часового пояса задаёт смещение в виде положительного или отрицательного количества часов и минут относительно стандартной базы времени. Существуют две стандартные базы времени, которые очень близки друг к другу, но не совсем одинаковы:

  • Для дат после введения всемирного координированного времени (UTC) в начале 1960-х годов базой времени является Z, а смещение указывает смещение конкретного часового пояса относительно времени на нулевом меридиане с долготой 0° (который проходит через Гринвичскую королевскую обсерваторию в Англии).
  • Для дат до введения UTC база времени выражается в шкале UT1, которая представляет собой солнечное время Земли на нулевом меридиане.

Строка часового пояса добавляется непосредственно после времени в строке даты и времени. Вы можете указать Z в качестве строки смещения часового пояса, чтобы показать, что время задано в UTC. В противном случае строка часового пояса строится следующим образом:

  1. Символ, указывающий знак смещения: знак плюс (+ или U+002B) для часовых поясов к востоку от нулевого меридиана или знак минус (- или U+002D) для часовых поясов к западу от нулевого меридиана.
  2. Двузначное количество часов смещения часового пояса относительно нулевого меридиана. Это значение должно быть от 00 до 23.
  3. Необязательный символ двоеточия (:).
  4. Двузначное количество минут часа; это значение должно быть от 00 до 59.

Хотя этот формат допускает часовые пояса от -23:59 до +23:59, текущий диапазон смещений часовых поясов составляет от -12:00 до +14:00, и в настоящее время нет часовых поясов со смещением относительно часа, отличным от 00, 30 или 45 минут. Это может измениться практически в любой момент, поскольку страны вольны менять свои часовые пояса в любое время и любым желаемым способом.

Примеры корректных строк глобальной даты и времени
Строка глобальной даты и времени Фактические глобальные дата и время Дата и время на нулевом меридиане
2005-06-07T00:00Z 7 июня 2005 г. в полночь UTC 7 июня 2005 г. в полночь
1789-08-22T12:30:00.1-04:00 22 августа 1789 г. через одну десятую долю секунды после 12:30 PM по восточному летнему времени (EDT) 22 августа 1789 г. через одну десятую долю секунды после 4:30 PM
3755-01-01 00:00+10:00 1 января 3755 г. в полночь по восточноавстралийскому стандартному времени (AEST) 31 декабря 3754 г. в 2:00 PM

Проблемы с датами

Из-за особенностей хранения данных и проблем с точностью полезно знать о некоторых проблемах на стороне клиента и на стороне сервера.

Проблема 2038 года (Y2K38, чаще на стороне сервера)

JavaScript использует числа с плавающей запятой двойной точности для хранения дат, как и для всех остальных чисел. Это означает, что код на JavaScript не пострадает от проблемы 2038 года, если только не используются приведение к целому числу или битовые трюки, поскольку все побитовые операторы JavaScript работают с 32-разрядными знаковыми целыми числами в дополнительном коде.

Проблема кроется на стороне сервера: хранение дат больше 2^31 - 1. Чтобы решить эту проблему, на сервере необходимо хранить все даты с использованием беззнаковых 32-разрядных целых чисел, знаковых 64-разрядных целых чисел или чисел с плавающей запятой двойной точности. Если ваш сервер написан на PHP, исправление может потребовать обновления PHP до более свежей версии и обновления оборудования до x86_64 или IA64. Если приходится работать с другим оборудованием, можно попытаться эмулировать 64-разрядное оборудование внутри 32-разрядной виртуальной машины, но большинство ВМ не поддерживают такую виртуализацию, поскольку может пострадать стабильность, а производительность гарантированно существенно снизится.

Проблема 10000 года (Y10k, чаще на стороне клиента)

На многих серверах даты хранятся в виде чисел, а не строк — чисел фиксированного размера, не зависящих от формата (за исключением порядка байтов). После 10 000 года эти числа просто станут немного больше, чем раньше, поэтому многие серверы не столкнутся с проблемами при отправке форм после 10 000 года.

Проблема возникает на стороне клиента: разбор дат, содержащих более 4 цифр в годе.

<!--midnight of January 1st, 10000: the exact time of Y10K-->
<input type="datetime-local" value="+010000-01-01T05:00" />

Нам нужно подготовить наш код к любому количеству цифр — не только к 5. Следующая функция JavaScript устанавливает значение программно:

function setValue(element, date) {
  const isoString = date.toISOString();
  element.value = isoString.substring(0, isoString.indexOf("T") + 6);
}

Зачем беспокоиться о проблеме Y10K, если она произойдёт спустя много веков после вашей смерти? Именно потому, что вы уже умрёте, и компании, использующие ваше программное обеспечение, останутся с ним наедине без какого-либо другого программиста, который знал бы систему достаточно хорошо, чтобы прийти и всё исправить.

Смотрите также

  • <input>
  • <ins> и <del>: см. атрибут datetime, который определяет дату или локальные дату и время добавления или удаления контента
  • Спецификация ISO 8601
  • Представление дат и времени в Руководстве по JavaScript
  • Объект JavaScript Date
  • Объект Intl.DateTimeFormat для форматирования даты и времени с учётом заданной локали

© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/HTML/Guides/Date_and_time_formats

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API