top of page

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


Околокомпьютерный блог Алика

  • alt.text.label.Facebook

© Околокомпьютерный блог Алика , 2022. Сайт создан на Wix.com

bottom of page