То, что вы делаете, это использование значений UTC как локальных, поэтому вам нужно использовать смещение часового пояса, чтобы вернуться к правильному времени.
Нет, это не будет работать во всех случаях, так как вы получаете смещение часового пояса для времени запуска функции, а не для даты, которую вы анализируете.Это может отличаться в местах, где смещение часового пояса изменилось либо в результате государственного регулирования или законодательства, либо в результате перехода на летнее время.Например, острова Лайн недавно изменились с -12 на + 14.
Итак, предполагая, что вы получаете данные в формате UTC, вы можете использовать Date.UTC, чтобы получить правильную дату и время:
// data for 2018-01-01T12:00:00Z
var data = {
dayOfMonth: 1,
hourOfDay: 12,
minute: 0,
month: 0,
second: 0,
year: 2018
};
// Current function, uses current timezone offset regardless of date
function toDate(data) {
return new Date(
data.year, data.month, data.dayOfMonth, data.hourOfDay,
data.minute - new Date().getTimezoneOffset(), data.second);
}
// Better function, pure UTC
function toDateNew(data) {
return new Date(Date.UTC(
data.year, data.month, data.dayOfMonth, data.hourOfDay,
data.minute, data.second));
}
console.log('Existing: ' + toDate(data).toISOString() +
'\nor : ' + toDate(data).toString() +
'\nNew func: ' + toDateNew(data).toISOString() +
'\nor : ' + toDateNew(data).toString()
);
Итак, теперь значения анализируются как UTC, устанавливая правильное значение времени даты.При отображении даты будут использоваться локальные значения, которые будут корректировать смещение часового пояса для даты на основе настроек хост-системы.Вам не нужно ничего делать.