Почему использование Date.UTC () возвращает совершенно другое значение месяца по сравнению с Date ()? - PullRequest
0 голосов
/ 30 августа 2018

В последнее время я работаю с Dates над проектом и заметил нечто странное, что, как мне кажется, не имеет смысла (или, по крайней мере, для меня это не имеет смысла).

В javascript вы можете создать новую дату, и по умолчанию, если вы получите месяц, он вернет номер текущего месяца минус один.

let dt = new Date();//Assume 30/8/2018
dt.getMonth();// returns 7

Вы также можете создать новую дату для запуска из UTC, используя существующую дату, и поскольку метод javascript .getMonth () для дат всегда возвращает номер месяца минус один, вы добавляете один, чтобы получить правильную месяц ... Однако Date.UTC (...) возвращает следующий месяц, а не текущий / правильный месяц

(Предположим, dt в приведенном ниже фрагменте совпадает с приведенным выше фрагментом с текущим временем)

let utc_dt = new Date(//Assume 30/8/2018
    Date.UTC(
        dt.getFullYear(),
        dt.getMonth()+1,
        dt.getDate(),
        dt.getHours(),
        dt.getMinutes(),
        dt.getSeconds()
    )
);
utc_dt.getMonth();// returns 9

Почему использование Date.UTC () возвращает совершенно другое значение месяца по сравнению с Date () ?

Я понимаю, что время UTC и время в браузерах, как правило, не совпадают, но, конечно, оно никогда не выйдет через месяц?

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

В дополнение к +1, dt.getMonth() возвращает местный месяц на основе настроек системы, тогда как Date.UTC будет интерпретировать второй параметр как UTC месяц .

Месяц UTC отличается для периода смещения местного часового пояса по обе стороны от полуночи в последний / первый день месяца. Так что если сегодня локально 31 августа, то вы добавляете 1, вы запрашиваете 31 сентября, который переносится на 1 октября.

Опять же, смещения часового пояса означают, что этот эффект распространяется на период смещения часового пояса, поэтому, по-видимому, это происходит в нелогичное время.

0 голосов
/ 30 августа 2018

Взято с этой страницы :

Используемые параметры:

[...]

  • месяц: указать целое число от 0 до 11, обозначающее месяц.

[...]

Это означает, что вы просто должны передать значение от 0 до 11, где 0 представляет январь, а 11 представляет декабрь:

let dt = new Date(); //Assume 30/8/2018
console.info(dt.getMonth()); // returns 7

let utc_dt = new Date( //Assume 30/8/2018
  Date.UTC(
    dt.getFullYear(),
    dt.getMonth(),
    dt.getDate(),
    dt.getHours(),
    dt.getMinutes(),
    dt.getSeconds()
  )
);
console.info(utc_dt.getMonth()); // returns 7
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...