Date.js неправильно анализирует дату UTC по ISO 8601
Используя библиотеку javascript Date.js, я обнаружил, что когда я передаю в функцию Date.parse() дату в формате UTC 0 в формате ISO 8601, я получаю объект, представляющий ту же дату, но с добавлением местного часового пояса.
Например,
Учитывая дату: 2012-08-27T14:57:00Z (в формате ISO 8601), которая показывает время 14:57 UTC, почему это должно быть проанализировано как 14:57 GMT-400, а не 10:57 GMT-400?
Я создал скрипку, чтобы показать это в действии.
Пожалуйста, дайте мне знать, если на самом деле произошла ошибка или мое понимание результата анализа неверно.
3 ответа
Да, это ошибка - даже сообщенная.
Могу ли я порекомендовать использовать библиотеку Moment.js? Например, это:
console.log(moment('2012-08-27T14:57:00Z').toString());
... правильно распознает, что указано время UTC.
Это похоже на ошибку с Date.js. С помощью new Date('2012-08-27T14:57:00Z')
возвращает правильную дату.
Это вызвано ошибочной реализацией довольно классного парсера грамматики DateJS.
По сути, старая версия только что проверила, может ли она использовать встроенный синтаксический анализатор, новая версия пытается использовать синтаксический анализ, но забывает сначала попробовать этот оригинальный шаг, и синтаксический анализатор не может использовать часовой пояс (что является ошибкой, но другой).
Замените функцию разбора на эту:
$D.parse = function (s) {
var date, time, r = null;
if (!s) {
return null;
}
if (s instanceof Date) {
return s;
}
date = new Date(Date._parse(s));
time = date.getTime();
// The following will be FALSE if time is NaN which happens if date is an Invalid Date
// (yes, invalid dates are still date objects. Go figure.)
if (time === time) {
return date;
} else {
// try our grammar parser
try {
r = $D.Grammar.start.call({}, s.replace(/^\s*(\S*(\s+\S+)*)\s*$/, "$1"));
} catch (e) {
return null;
}
return ((r[1].length === 0) ? r[0] : null);
}
};
Обновленная версия кода ядра (и в будущем она будет исправлять открытые ошибки) доступна здесь: