setFullYear добавляет 1 час — требуется объяснение

#javascript #date

#javascript #Дата

Вопрос:

Пожалуйста, помогите мне понять несоответствие ожидаемого результата реальности, когда я пытаюсь увеличить год для даты с помощью .setFullYear() (или .setUTCFullYear() — тот же результат).

Настройка:

 let timestamp = '2010-10-12T12:00:00Z';
const initialDate = new Date(timestamp);
const resultingDate = new Date(initialDate.setFullYear(2020));

console.log('timestamp    : '   timestamp);
console.log('initialDate  : '   initialDate.toISOString())
console.log('resultingDate: '   resultingDate.toISOString())  

Ожидания:

 expect(resultingDate).toEqual(new Date('2020-10-12T12:00:00Z'));
  

Реальность:

 resultingDate === new Date('2020-10-12T13:00:00Z')
  

Вопрос:

Как, черт возьми, я получил увеличение результата на один час? Я устанавливаю только годы. Или я?

Комментарии:

1. Не знаю о дополнительном 1 часе, но, к вашему сведению setFullYear , видоизменяет initialDate . Таким образом, ваш initialDate должен быть равен resultingDate . developer.mozilla.org/en-US/docs/Web/JavaScript/Reference /…

2. Спасибо, я знаю. Основное внимание в этой истории уделяется полученному «13» вместо «12». Если я сотру время (на new Date(new Date(dateStart).toISOString().substr(0,10)) ) — результат станет ...T01:00... выигрышем в один час — откуда он берется?

3. Вы не можете сравнивать такие даты. Что, если вы печатаете initialDate , у этого также есть 1 час?

4. Обновление: если initialDate год 2015, 2016, 2017, 2018 и т. Д., То Установка на 2020 не влияет на время. Однако, если год 2014 и ниже (2013, 2012 и т. Д.), То Эта операция увеличивает время на 1 час.

5. Нет, это не так… но я не в том же часовом поясе, что и вы — были ли изменения летнего времени в вашем часовом поясе?

Ответ №1:

Проблема связана с тем, что произошло с московским временем в 2014 году. Смотрите: Часовой пояс Москвы

Фактически, Москва изменилась с UTC 4 на UTC 3 26/10/2014. Итак, 10.12.2010, 16:00 по Москве было 12:00 по времени UTC. Но с 2015 года 16:00 по Москве было 13:00 по времени UTC. Итак, даты до 2014 года будут показывать 12:00, а даты после этого будут показывать 13:00.

Комментарии:

1. Вы можете попробовать использовать Date.UTC(…) для построения вашей даты, поскольку это не ссылается на местное часовое пояснение.