Часовой пояс Javascript по Гринвичу и смещению

Я довольно много читал о UTC/GMT и часовых поясах, когда дело доходит до класса Javascript Date. Но есть кое-что, чего я не понимаю:

const date = new Date('August 19, 1975 23:15:30 GMT+04:00');
const offset = date.getTimezoneOffset()

Я думал, что «GMT + 0400» указывает, что моя текущая дата на 4 часа раньше времени UTC. Таким образом, UTC будет «19 августа 1975 г., 19:15:30».

Почему «смещение» не -4? Использует ли getTimezoneOffset локаль моего браузера, и если да, то могу ли я создать дату в определенном часовом поясе?


person Julia    schedule 31.08.2020    source источник


Ответы (1)


Я думал, что «GMT + 0400» указывает, что моя текущая дата на 4 часа раньше времени UTC.

Этот GMT+0400 указывает, что текст в строке выражен в формате GMT+0400. Но экземпляры JavaScript Date не позволяют указать, какой часовой пояс они используют. Они используют смещение в миллисекундах от 1 января 1970 года в полночь UTC и предоставляют функции для доступа к частям момента времени, которые они представляют, либо в единицах относительно часового пояса системы, в которой работает код (getDate, getHours и т. д. ) или в единицах относительно UTC (getUTCDate, getUTCHours). getTimezoneOffset говорит вам, в чем разница между ними.

Таким образом, хотя текст, который вы указали для анализа, выражен в формате GMT+0400, часовой пояс, который экземпляр использует для функций местного времени, всегда является местным часовым поясом.

Вот пример этого факта: две строки, выраженные в разных часовых поясах, но которые приводят к эквивалентным Date экземплярам:

const s1 = "2020-08-31 12:30:00-0300";
const s2 = "2020-08-31 20:30:00+0500";
const d1 = new Date(s1);
const d2 = new Date(s2);
console.log(`s1 = ${s1}`);
console.log(`d1 = ${d1.toString()}`);
console.log(`s2 = ${s2}`);
console.log(`d2 = ${d2.toString()}`);
console.log(`d1 and d2 equivalent? ${d1.getTime() === d2.getTime()}`);

Использует ли getTimezoneOffset локаль моего браузера?

да.

... и если да, то могу ли я создать дату в определенном часовом поясе?

Нет. Но новое временное предложение, вероятно, позволит вам иметь Temporal.Absolute экземпляров с указанным часовым поясом. (Это все еще на ранней стадии, так что все может измениться.)

person T.J. Crowder    schedule 31.08.2020