Мое решение сохраняет дату неизменной независимо от того, какой часовой пояс установлен на стороне клиента. Может быть, кто-то найдет это полезным.
Мой вариант использования:
Я создаю приложение 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
}