JS: приключения с таймзонами
- Алик Ким
- 21 апр. 2023 г.
- 1 мин. чтения
охх пришлось поковыряться.
в общем:
1) стандартный дейт-пикер (input type="date") оперирует глобальным временем. то есть, когда ты передаешь ему местную полночь (UTC+6) - он ее трактует как 18-00 предыдущего дня в Гринвиче. и, соответственно, отображает дату на день раньше, чем я ему передал.
2) new Date("2023-04-21") сформирует полночь этой даты по UTC-0 (6 утра по местному). а вот new Date("2023-04-21T00:00:00") создает почему-то местную полночь. мне с сервера даты приходили именно в этом последнем формате.
3) JSON.Stringify формирует строку для таймзоны UTC-0 (для местной полуночи в строке будет значиться дата предыдущего дня)
попарился-попарился, в итоге применил решение - входную дату прогонять через вот это: date.setMinutes(-date.getTimezoneOffset());
это преобразует местную полночь в полночь по UTC-0
private static normalizeDateOnlyValue(localMidnight: Date): Date {
if (localMidnight.getTime() != this.getDatePart(localMidnight).getTime()) {
throw new Error("normalizeDateOnlyValue needs local midnight as input");
}
let res = this.cloneDate(localMidnight);
res.setMinutes(-res.getTimezoneOffset());
return res;
}
private static getDatePart = (date: Date) => new Date(date.getFullYear(), date.getMonth(), date.getDate());
private static cloneDate = (date: Date) => new Date(date.getTime()); //https://stackoverflow.com/a/1090817
Comments