JS / TS Date конструктор объекта - PullRequest
0 голосов
/ 13 декабря 2018

Я страдаю из-за неоднозначности объекта Date: местное время против UTC.Проблема:

Пользователи могут вводить год, месяц, день, час, минуту, которые затем будут использоваться для объекта Date:

const d1 = new Date(y, mo -1, d, h, m)

Это создает новую дату дляпользовательский ввод в UTC .Всякий раз, когда я вызываю d1.toISOString(), он возвращает строку ISO для UTC , а не локальный часовой пояс пользователя.

Кроме того, d1.getHours(), например, будет по местному времени, но с d1.getTimezoneOffset() добавлено к значениям.Итак

d1.getHours() != h
d1.getHours() == h - d1.getTimezoneOffset()

Как это можно решить?

Я вижу следующую документацию

Примечание: где Date вызывается как конструктор с более чем одним аргументом, указанные аргументы представляют локальное время.Если требуется UTC, используйте новую дату (Date.UTC (...)) с теми же аргументами.

Но я не могу понять, как правильно использовать местное и UTC время...

Мой вопрос:

Как правильно использовать Date для обработки ввода пользователя и как вызвать toISOString для получения локальных временных меток?Мне нужна строка для локальной даты, как указано пользователем в формате ISO.Не локаль, только цифры.Мне плевать на вывод локали.

1 Ответ

0 голосов
/ 13 декабря 2018

Дано:

const d1 = new Date(y, mo -1, d, h, m)

затем:

d1.getHours() != h

только в случаях, когда выполняется одно из следующих условий:

  1. ч не существует на эту дату (например, он находится в период перехода от стандартного к летнему времени)
  2. ч <0 </li>
  3. ч> 23.

Следующее показывает, что когда ни один из них не соответствует действительности, то d.getHours() == h

let [Y, M, D, h, m, s] = [2018, 0, 1, 15, 30, 15]; // 2018-01-01T15:30:15
var d = new Date(Y, M, D, h, m, s);
console.log(d.getHours() == h);

Как правильно использовать Date для обработки ввода пользователя и как вызывать toISOString для получения локальных меток времени?

Где Dateконструктор вызывается с более чем одним аргументом, значения рассматриваются как локальные.Чтобы рассматривать их как UTC, используйте метод Date.UTC :

`new Date(Date.UTC(Y, M, D, h, m, s)); 

Метод toISOString всегда возвращает метку времени UTC.Если вам нужна метка времени ISO 8601 с локальным смещением часового пояса, вам следует либо использовать библиотеку, либо написать собственную функцию, например:

function toISOStringLocal(d) {
  // Pad single digit numbers with leading zero
  function z(n){return (n<10?'0':'') + n}
  // Convert timezoneOffset to HH:mm
  function formatOffset(offset) {
    let sign = offset < 0? '+' : '-';
    offset = Math.abs(offset);
    return sign + z(offset/60|0) + ':' + z(offset%60);
  }
  return d.getFullYear() + '-' + z(d.getMonth()+1) + '-' +
         z(d.getDate()) + 'T' + z(d.getHours()) + ':' +
         z(d.getMinutes()) + ':' + z(d.getSeconds()) +
         formatOffset(d.getTimezoneOffset());              
}

console.log(toISOStringLocal(new Date()));

Использование «:» в смещении должно соответствовать ECMA-262 и должно допускаться синтаксическими анализаторами, совместимыми с ISO 8601.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...