Javascript Date, setFullYear меняет часовой пояс - PullRequest
0 голосов
/ 20 сентября 2018

Даты Javascript работают с часовыми поясами.Если я создаю дату, она устанавливает часовой пояс.Когда я обновляю год этой даты, я не ожидаю, что часовой пояс изменится.Это делает, однако.Хуже всего то, что это меняет часовой пояс, но не время, приводя к смещению фактического времени на один час!

Это вызывает проблему, что если у меня есть дата рождения человека, и я хочу знать его день рождения, то этоyear, я не могу просто установить год для текущего года, используя birthdate.setFullYear(2018), потому что он вернет день рождения минус один час.Это означает, что это происходит за один день до фактического дня рождения, в одиннадцать часов.

let test = new Date('1990-10-20');
console.log(test);
console.log(test.toISOString().substring(0, 10));

// 1990-10-20 ( Sat Oct 20 1990 01:00:00 GMT+0100 (Central European Standard Time) )

test.setFullYear(2000);
console.log(test);
console.log(test.toISOString().substring(0, 10));

// 2000-10-19 ( Fri Oct 20 2000 01:00:00 GMT+0200 (Central European Summer Time) === one hour too soon!! )

Возможно, ваш часовой пояс не воспроизводится, вот мой вывод:

"1990-10-20T00: 00: 00.000Z"

1990-10-20

" 2000-10-19T23: 00: 00.000Z "

2000-10-19

Единственный обходной путь, который я нашел, - это подставить дату и заменить ее как строковые значения.Как я могу сделать это лучше, используя объект Date?

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

ОСТОРОЖНО TIMEZONE Если вы хотите работать только с датой, используя объект даты (и вам это нужно более или менее), ваши объекты даты должны представлять UTC в полночь вначало рассматриваемой даты.В вашем случае, чтобы указать год, используйте полночь UTC в начале 1 января.Это общее и необходимое соглашение, но оно требует много внимания, чтобы убедиться, что часовой пояс не закрадывается, как вы обнаружили.

Когда вы говорите, что «даты в javascript работают с часовыми поясами», javascript date - это момент времени (тики начиная с эпохи) с удобными статическими функциями для преобразования этого момента в значимую строку в местном часовом поясе (или указанном часовом поясе).Сам объект даты не имеет свойства часового пояса.

Итак, вы можете создать свой полуночный UTC год с чем-то вроде ...

var myDate = new Date(Date.UTC(2018,0,1)); // months are zero-indexed !

Затем сериализовать его, указав UTC ...

myDate.toISOString();
myDate.toLocaleDateString("en",{timezone:"UTC"});
0 голосов
/ 20 сентября 2018

Хм, может быть, было бы лучше вместо этого использовать setUTCFullYear(...) ( MDN Docs )?По крайней мере, в этом случае это не испортит время.

let test = new Date('1990-10-20');
console.log(test);
console.log(test.toISOString().substring(0, 10));

// "1990-10-20T00:00:00.000Z")

test.setUTCFullYear(2000);
console.log(test);
console.log(test.toISOString().substring(0, 10));

// "2000-10-20T00:00:00.000Z"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...