У меня есть следующая функция, которую я написал для преобразования msSinceEpoch
в новозеландскую дату (совместимо с IE11) ...
const MAGICNUMBER = 13;
const toNewZealand = (msSinceEpoch) => {
const [day, month, year, time] = new Date(msSinceEpoch).toLocaleString("en-NZ", {
hour12: false, timeZone: "UTC"
}).split(/[/,]/); // timeZone UTC is the only format support on IE11
const [hours, minutes, seconds] = time.trim().split(":");
return new Date(~~year, ~~month - 1, ~~day, ~~hours + MAGICNUMBER, ~~minutes, ~~seconds)
};
// usage....
console.log(
toNewZealand(new Date().getTime())
)
Однако здесь содержится магическое число, которое не относится к летнему времени Новой Зеландии (+12 или +13).
Так что тут все сложно, как мне получить правильное число относительно перехода на летнее время в Новой Зеландии (+12 или +13).
Моя первая попытка состояла в том, чтобы просто вычислить, было ли это между последним воскресеньем сентября или первым воскресеньем апреля, но потом я понял, что во второй раз я использую конструктор new Date()
где-нибудь в коде, в котором он собирается создать относительную дату к их системному времени и сломать математику.
TL; DR. Конвертировать UTC в миллисекунды с начала Новой Зеландии, что соответствует настройкам перехода на летнее время в Новой Зеландии.
РЕДАКТИРОВАТЬ: также не заинтересованы в использовании Moment или любой другой библиотеки для решения этой проблемы из-за размера пакета.