В четвертой статье серии функций 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!