Статьи

Создание метки даты ISO

В четвертой статье серии функций small-and-sweet представлена ​​функция под названием datestamp() , которая использует различные методы JavaScript Date для создания строки даты UTC в формате ISO 8601 , например «1991-08-06T08: 30: 00Z ».

Формат ISO 8601 — это невероятно надежный и повсеместный способ представления дат. Это формат выбора для многих других стандартов и спецификаций, потому что он включает в себя множество полей:

  • Он хранит полную дату и время, предоставляя всю необходимую необработанную информацию для создания любого другого формата.
  • Он имеет явные разделители, не имеет внутреннего пробела и всегда имеет постоянную длину — все это позволяет легко, дешево и однозначно анализировать.
  • Его можно использовать во многих языковых конструкциях дат, таких как входные данные для объекта JavaScript Date или значение в столбце SQL DATESTAMP .
  • В алфавитном порядке сортируется в хронологическом порядке.
  • Он создается автоматически, когда объект JavaScript Date передается в JSON.stringify() .
  • Это формат и профиль, рекомендуемые W3C .
  • Используется во вводе "datetime" в HTML5 .

Функция datestamp является удобной абстракцией для создания этого формата и работает даже в самых простых браузерах JavaScript. Вот код:

 function datestamp(date) { if(isNaN((date = typeof(date) !== 'undefined' ? new Date(date) : new Date()).getTime())) { return null; } var pad2 = function(n) { return (n < 10 ? '0' : '') + n; }, tokens = [[['FullYear'], ['Month', 1], ['Date']], [['Hours'], ['Minutes'], ['Seconds']]]; for(var a = tokens.length, i = 0; i < a; i ++) { for(var b = tokens[i].length, j = 0; j < b; j ++) { tokens[i][j] = pad2(date['getUTC' + tokens[i][j][0]]() + (tokens[i][j][1] || 0)); } } return tokens[0].join('-') + 'T' + tokens[1].join(':') + 'Z'; } 

Как работает функция

Функция может создавать новую дату или начинаться с любой входной даты, поддерживаемой конструктором JavaScript Date() . Примерами поддерживаемых форматов являются метки времени Unix, метки Date ISO и существующие объекты Date . В следующем примере показано datestamp() в действии. Обратите внимание, что следует избегать частичных дат, таких как "1991-08-06" , потому что браузеры различаются по тому времени, которое они предполагают.

 datestamp(); datestamp(1333880482000); datestamp("Mon, 07 Feb 2000 09:22:04 GMT"); datestamp("Sun, 06 Feb 2000 23:22:04 +10:00"); datestamp("1973-05-29T03:03:45Z"); datestamp(new Date(1349646120000)); времени datestamp(); datestamp(1333880482000); datestamp("Mon, 07 Feb 2000 09:22:04 GMT"); datestamp("Sun, 06 Feb 2000 23:22:04 +10:00"); datestamp("1973-05-29T03:03:45Z"); datestamp(new Date(1349646120000)); 

Если ввод неверен, функция возвращает null . В противном случае объект Date создается и форматируется с использованием различных UTC-специфических методов, таких как getUTCFullYear() и getUTCDate() . Вы можете видеть, как массив tokens изначально хранит набор ссылок на эти функции, и итерационный код использует эти ссылки для создания каждого имени метода, например, Minutes для getUTCMinutes() ; метод вызывается, затем возвращаемое значение перезаписывает исходную ссылку.

Определение для Month также указывает числовой прирост — ["Month", 1] а не просто ["Month"] . Это связано с тем, что метод getUTCMonth() возвращает числа от 0 до 11 , тогда как месяцы в формате ISO должны быть от 1 до 12 (точнее, от "01" до "12" ).

Хранить токены в массивах не обязательно, просто очень удобно. Это означает, что мы можем уменьшить размер кода, создавая вызовы методов на лету, а затем скомпилировать основную часть метки дат всего парой вызовов join() .

Универсал — это лучшее!

Функция datestamp() создает даты только в формате UTC, потому что они предназначены для программного использования, а не для удобочитаемого вывода (хотя, с точки зрения программных форматов, они в высшей степени читаемы!). Хранение даты и времени в разных часовых поясах также не нужно и может сбивать с толку — проще всего всегда хранить их в формате UTC. Таким образом, у вас есть общая система сравнения и оценки без потери информации, необходимой для интернационализации.

Когда придет время отображать даты и время в браузере пользователя, преобразуйте их в более удобный локальный формат. JavaScript особенно удобен для этого, потому что он оценивает на клиенте, используя их часы. Таким образом, любая временная метка, прошедшая через конструктор Date() автоматически конвертируется в локаль пользователя (если только вы не используете методы getUTC , как мы делаем в этой функции). Взять дату в формате UTC в формате ISO и преобразовать ее в удобную для человека и специфичную для локали дату может быть так просто:

 new Date("1991-08-06T08:30:00Z").toString(); 

Вывод

Формат ISO 8601, возможно, является наиболее полезным форматом для хранения дат. Но у него есть один небольшой недостаток в том, что некоторые старые браузеры не поддерживают его в качестве входных данных для конструктора Date() . Эти браузеры включают Safari 3 и Internet Explorer 8 или более ранние версии. Итак, в следующей статье из этой краткой и приятной серии функций я покажу вам обратную функцию, которая анализирует метки даты ISO для создания метки времени Unix — что может понять даже IE6!