Подтвердить что ты не робот

Javascript: проанализировать строку в Date как LOCAL часовой пояс

У меня есть строка, представляющая текущее время: 2015-11-24T19:40:00. Как разобрать эту строку в Javascript, чтобы получить дату, представленную этой строкой, как МЕСТНОЕ ВРЕМЯ? Из-за какого-то ограничения я не могу использовать библиотеку moment, но jquery разрешен. Я знаю, что кто-то задавал этот вопрос раньше, но ответ использовал moment

Например, если я запустил script в Калифорнии, то эта строка будет представлять собой тихое время 7PM, но если я запустил script в NY, то эта строка будет представлять восточное время?

Я пробовал следующее, но Chrome и Firefox дают мне разные результаты:

var str = "2015-11-24T19:40:00";
var date = new Date(str);

Chrome расходует его как UTC (Tue Nov 24 2015 11:40:00 GMT-0800 (Pacific Standard Time)),

но Firefox использует его как мое местное время PACIFIC (Tue Nov 24 2015 19:40:00 GMT-0800 (Pacific Standard Time))

Я попробовал добавить "Z" к str, как этот var date = new Date(str+"Z");, тогда оба браузера дадут мне время UTC. Есть ли подобное письмо в "Z", которое сообщает обо всем браузерам (по крайней мере, хром, Firefox и Safari) синтаксический анализ строки как локального часового пояса?

4b9b3361

Ответ 1

Рекомендуется синтаксический анализ строк даты с использованием конструктора Date или Date.parse(которые по сути являются одним и тем же).

Если Date вызывается как функция и передает строку даты формата ISO 8601 без часового пояса (например, 2015-11-24T19: 40: 00), вы можете получить один из следующих результатов:

  • Pre ES5 implementaitons может рассматривать его как что угодно, даже NaN (например, IE 8).
  • Реализации, совместимые с ES5, будут обрабатывать его как часовой пояс UTC
  • Соответствующие реализации ECMAScript 2015 будут относиться к нему как к локальному (что соответствует ISO 8601).

Объект Date имеет значение времени, равное UTC, и смещение на основе системных настроек. Когда вы отправляете дату для вывода, то, что вы видите, обычно является результатом Date.prototype.toString, который является зависимой от реализации, человеческой читаемой строкой, представляющей дату и время, обычно в часовом поясе на основе системных настроек.

Лучший способ синтаксического анализа строк даты - сделать это вручную. Если вы уверены, что формат согласован и действителен, то синтаксический анализ строки формата ISO как локальной даты так же прост, как:

/*  @param {string} s - an ISO 8001 format date and time string
**                      with all components, e.g. 2015-11-24T19:40:00
**  @returns {Date} - Date instance from parsing the string. May be NaN.
*/
function parseISOLocal(s) {
  var b = s.split(/\D/);
  return new Date(b[0], b[1]-1, b[2], b[3], b[4], b[5]);
}

document.write(parseISOLocal('2015-11-24T19:40:00'));

Ответ 2

Вариант ответа RobG.

Примечание, что это потребует, чтобы вы запускали краткий фронт JavaScript как он опирается на оператор нотации и распространения стрелки.

function parseDateISOString(s) {
  let ds = s.split(/\D/).map(s => parseInt(s));
  ds[1] = ds[1] - 1; // adjust month
  return new Date(...ds);
}

Преимущество этого подхода заключается в том, что он автоматически применяет правильное количество переданных аргументов. Если это то, что вы хотите.

Ответ 3

Если Date вызывается как конструктор с несколькими аргументами, указанные аргументы представляют собой локальное время.

У меня также намного более быстрый способ, чем использование string.split(), потому что мы уже знаем, где числа:

return new Date(Number(date.substring(0, 4)), Number(date.substring(5, 7))-1, 
                Number(date.substring(8, 10)), Number(date.substring(11, 13)), 
                Number(date.substring(14, 16)), Number(date.substring(17, 19)));

Это будет работать с и/или без строк "T" и "Z" и по-прежнему имеет достойную производительность. Я добавил явное преобразование чисел (быстрее и лучше, чем parseInt), поэтому оно также компилируется в TypeScript. Число