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 утра [подробности]
08:45:25 8:45 утра и 25 секунд [подробности]
0033-08-04T03:40 3:40 утра 4 августа 33 года [подробности]
1977-04-01T14:00:30 2:00 дня, 1 апреля 1977 года, через 30 секунд [подробности]
1901-01-01T00:00Z Полночь по UTC 1 января 1901 года [подробности]
1901-01-01T00:00:01-04:00 Секунда после полуночи по восточному стандартному времени (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 до н.э. (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 — 23. Значения вне диапазона 00 – 23 запрещены.
  • Минута должна быть двузначным числом от 00 до 59. Значения вне этого диапазона недопустимы.
  • Если количество секунд опущено (чтобы указать время с точностью только до минуты), после числа минут не должно быть двоеточия.
  • Если указано количество секунд, его целая часть должна быть между 00 и 59. Вы не можете указать високосные секунды, используя значения вроде 60 или 61.
  • Если количество секунд указано и является целым числом, оно не должно быть после десятичной запятой.
  • Если включается дробная часть секунды, она может состоять из одной, двух или трех цифр, обозначающих миллисекунды. Она следует за десятичной запятой, помещённой после компонента секунд в строке времени.
Строка времени Время
00:00:30.75 12:00:30.75 (30.75 секунд после полуночи)
12:15 12:15
13:44:25 13:44:25 (25 секунд после 13:44)

Локальные строки дат и времени

Действительная строка 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
1986-01-28 11:38:00.010

1986-01-28T11:38:00.01

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

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

0170-07-31T22:00

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

31 июля 170 года в 22:00

Глобальные строки дат и времени

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

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

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

  • Для дат после установления координированного универсального времени (UTC) в начале 1960-х годов, временным базисом является Z, а смещение указывает смещение конкретного часового пояса от времени на нулевом меридиане (который проходит через Королевскую обсерваторию в Гринвиче, Англия).
  • Для дат до 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 по восточному летнему времени (EDT) 22 августа 1789 года в десятую долю секунды после 16:30
3755-01-01 00:00+10:00 1 января 3755 года в полночь по австралийскому восточному стандартному времени (AEST) 31 декабря 3754 года в 14:00

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

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

Проблема Y2K38 (часто на стороне сервера)

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

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

Проблема Y10k (часто на стороне клиента)

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

Проблема возникает на стороне клиента: парсинг дат с более чем 4 цифрами в году.

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

Всё так просто. Просто подготовьте свой код к любому количеству цифр. Не готовьте только к 5 цифрам. Вот код JavaScript для программной установки значения:

js
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–2023 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/HTML/Date_and_time_formats

Spec-Zone.ru

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