Javascript date parsing on Iphone
Я работаю над автономным сайтом Javascript, который предназначен для мобильных устройств. Одним из таких мобильных устройств является IPhone.
Я пытаюсь проанализировать дату из нашего REST API (члена объекта JSON). Я использую
Date.parse("2010-03-15 10:30:00");
Это работает на устройствах Android, однако на IPhone он просто дает недопустимую дату.
Как мне отформатировать строку даты, чтобы ее можно было проанализировать с помощью IPhone?
Ответы
Ответ 1
Не все браузеры поддерживают одинаковые форматы даты. Наилучший подход состоит в том, чтобы разбить строку на разделительные символы (-
,
и :
) и передать каждый из полученных элементов массива в конструктор Date
:
var arr = "2010-03-15 10:30:00".split(/[- :]/),
date = new Date(arr[0], arr[1]-1, arr[2], arr[3], arr[4], arr[5]);
console.log(date);
//-> Mon Mar 15 2010 10:30:00 GMT+0000 (GMT Standard Time)
Это будет работать одинаково во всех браузерах.
Ответ 2
Для времени UTC/GMT вы можете попробовать:
var arr = "2014-10-27T16:05:44+0000".split(/[\-\+ :T]/);
var date = new Date();
date.setUTCFullYear(arr[0]);
date.setUTCMonth(arr[1] - 1);
date.setUTCDate(arr[2]);
date.setUTCHours(arr[3]);
date.setUTCMinutes(arr[4]);
date.setUTCSeconds(arr[5]);
Объект даты будет отображаться в соответствующем локальном часовом поясе при использовании.
Ответ 3
Вам может быть повезло, если вы придерживаетесь формата ISO 8601:
Date.parse("2010-03-15T10:30:00");
// e.g.
var d = new Date( Date.parse("2010-03-15T10:30:00") );
console.log( d.toString() ); //Mon Mar 15 2010 10:30:00 GMT+0000 (BST)
Ответ 4
Обновление 2019-07-29: Не удаляйте существующий контент ниже, но я настоятельно рекомендую вам не использовать этот метод. Я учился на своих ошибках. Не переопределяйте существующие методы JavaScript. Становится плохо для переносимости вашего кода и производительности. Если вы не можете получить ISO 8601 (что является стандартной практикой в JS и большинстве API) - измените эту систему. В качестве альтернативы напишите свою собственную функцию, которая всегда должна вызываться для создания объекта Date
.
Если вы можете исправить свой REST API так, чтобы он отправлял правильное время даты ISO 8601, то правильный способ справиться с этим - использовать регулярное выражение, которое позволяет всем браузерам обрабатывать даты ISO 8601. Конечно, это может быть медленнее, но работать с датами с помощью Javascript - это все равно, что пытаться посадить кота в воду.
Имейте в виду, что следующий метод переопределяет оригинальный метод Date.parse. Это может быть проблематично в больших проектах или со многими разработчиками с разными ожиданиями. Используйте, только если вы знаете, что делаете.
/**
* Date.parse with progressive enhancement for ISO 8601 <https://github.com/csnover/js-iso8601>
* © 2011 Colin Snover <http://zetafleet.com>
* Released under MIT license.
*/
(function (Date, undefined) {
var origParse = Date.parse, numericKeys = [ 1, 4, 5, 6, 7, 10, 11 ];
Date.parse = function (date) {
var timestamp, struct, minutesOffset = 0;
// ES5 §15.9.4.2 states that the string should attempt to be parsed as a Date Time String Format string
// before falling back to any implementation-specific date parsing, so thats what we do, even if native
// implementations could be faster
// 1 YYYY 2 MM 3 DD 4 HH 5 mm 6 ss 7 msec 8 Z 9 ± 10 tzHH 11 tzmm
if ((struct = /^(\d{4}|[+\-]\d{6})(?:-(\d{2})(?:-(\d{2}))?)?(?:T(\d{2}):(\d{2})(?::(\d{2})(?:\.(\d{3}))?)?(?:(Z)|([+\-])(\d{2})(?::(\d{2}))?)?)?$/.exec(date))) {
// avoid NaN timestamps caused by 'undefined' values being passed to Date.UTC
for (var i = 0, k; (k = numericKeys[i]); ++i) {
struct[k] = +struct[k] || 0;
}
// allow undefined days and months
struct[2] = (+struct[2] || 1) - 1;
struct[3] = +struct[3] || 1;
if (struct[8] !== 'Z' && struct[9] !== undefined) {
minutesOffset = struct[10] * 60 + struct[11];
if (struct[9] === '+') {
minutesOffset = 0 - minutesOffset;
}
}
timestamp = Date.UTC(struct[1], struct[2], struct[3], struct[4], struct[5] + minutesOffset, struct[6], struct[7]);
}
else {
timestamp = origParse ? origParse(date) : NaN;
}
return timestamp;
};
}(Date));
https://github.com/csnover/js-iso8601