Моє рішення зберігає дату однаковою незалежно від того, який часовий пояс встановлений на стороні клієнта. Можливо, комусь це стане в нагоді.
Мій випадок використання:
Я створюю додаток todo, де ви встановлюєте дату свого завдання. Ця дата повинна залишатися незмінною незалежно від того, в якому часовому поясі ви знаходитесь.
Приклад. Ви хочете зателефонувати своєму другові о 8 годині ранку 25 червня.
Ви створюєте це завдання за 5 днів до (20 червня), перебуваючи в Китаї.
Потім, в той же день, ви летите до Нью-Йорка на кілька днів.
Тоді 25 червня, поки ви все ще знаходитесь у Нью-Йорку, ви прокидаєтесь о 7:30 ранку (це означає, що ви повинні отримати повідомлення про завдання через 30 хвилин (навіть тому, що це 13:30 вже в Китаї, де ви були під час створення завдання)
Тож завдання - це ігнорування часового поясу. Це означає: "Я хочу це зробити о 8 ранку в будь-який часовий пояс, в якому я буду".
Що я роблю, - скажімо, "я припускаю, що ви завжди в лондонському часовому поясі - UTC".
Що це означає - коли користувач вибирає якусь дату у своєму часовому поясі - я перетворюю цю дату на ту саму дату в UTC. тобто. Ви вибираєте 8 ранку в Китаї, але я перетворюю його на 8 ранку в UTC.
Потім - наступного разу, коли ви відкриєте додаток - я прочитаю збережену в UTC дату і перетворять її на ту саму дату у вашому поточному часовому поясі - наприклад. Я перетворюю 8 ранку в UTC та 8 ранку в нью-йоркському часовому поясі.
Це рішення означає, що дата може означати щось інше, залежно від того, де ви знаходитесь, і де читаєте, але вона залишається постійною таким чином, що вона "відчуває", як ви завжди в одному часовому поясі.
Давайте запишемо якийсь код:
По-перше - у нас є дві основні функції для перетворення з / на UTC ігнорування часового поясу:
export function convertLocalDateToUTCIgnoringTimezone(date: Date) {
const timestamp = Date.UTC(
date.getFullYear(),
date.getMonth(),
date.getDate(),
date.getHours(),
date.getMinutes(),
date.getSeconds(),
date.getMilliseconds(),
);
return new Date(timestamp);
}
export function convertUTCToLocalDateIgnoringTimezone(utcDate: Date) {
return new Date(
utcDate.getUTCFullYear(),
utcDate.getUTCMonth(),
utcDate.getUTCDate(),
utcDate.getUTCHours(),
utcDate.getUTCMinutes(),
utcDate.getUTCSeconds(),
utcDate.getUTCMilliseconds(),
);
}
Потім я зберігаю / читаю цю дату, наприклад:
function saveTaskDate(localDate: Date) {
// I convert your local calendar date so it looks like you've picked it being in UTC somewhere around London
const utcDate = convertLocalDateToUTCIgnoringTimezone(localDate);
api.saveTaskDate(utcDate);
}
function readTaskDate(taskUtcDate: Date) {
// I convert this UTC date to 'look in your local timezone' as if you were now in UTC somewhere around london
const localDateWithSameDayAsUTC = convertUTCToLocalDateIgnoringTimezone(taskUtcDate);
// this date will have the same calendar day as the one you've picked previously
// no matter where you were saving it and where you are now
}