В четвертой статье серии функций small-and-sweet представлена функция под названием datestamp() , которая использует различные методы JavaScript Date для создания строки даты UTC в формате ISO 8601 , например «1991-08-06T08: 30: 00Z ».
Формат ISO 8601 — это невероятно надежный и повсеместный способ представления дат. Это формат выбора для многих других стандартов и спецификаций, потому что он включает в себя множество полей:
- Он хранит полную дату и время, предоставляя всю необходимую необработанную информацию для создания любого другого формата.
- Он имеет явные разделители, не имеет внутреннего пробела и всегда имеет постоянную длину — все это позволяет легко, дешево и однозначно анализировать.
- Его можно использовать во многих языковых конструкциях дат, таких как входные данные для объекта JavaScript
Dateили значение в столбце SQLDATESTAMP. - В алфавитном порядке сортируется в хронологическом порядке.
- Он создается автоматически, когда объект 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!