Çözümüm, istemci tarafında hangi saat dilimi ayarlanmış olursa olsun tarihi aynı tutar. Belki birisi bunu faydalı bulabilir.
Kullanım durumum:
Görevinizin tarihini ayarladığınız bir todo uygulaması oluşturuyorum. Hangi tarih diliminde olursanız olun bu tarih sabit kalmalıdır.
Misal. 25 Haziran günü sabah 8'de arkadaşınızı aramak istiyorsunuz.
Bu görevi Çin'deyken 5 gün (20 Haziran) önce yaratırsınız.
Aynı gün, birkaç gün New York'a uçuyorsunuz.
Daha sonra 25 Haziran'da, hala New York'dayken, sabah 7: 30'da uyanıyorsunuz (yani 30 dakika içinde görev bildirimi almanız gerekiyor (hatta Çin'de oluşturduğunuz saat 13: 30'da bile) görev)
Yani görev saat dilimini görmezden gelmek. 'Ben saat 8'de bunu yapmak istediğim saat diliminde yapmak istiyorum' anlamına gelir.
Yaptığım şey 'Her zaman Londra Saat Dilimi - UTC'de olduğunuzu varsayıyorum' diyelim.
Bunun anlamı - kullanıcı saat diliminde bir tarih seçtiğinde - bu tarihi UTC'de aynı tarihe dönüştürürüm. yani. Çin'de sabah 8'i seçiyorsunuz, ancak UTC'de sabah 8'e dönüştürüyorum.
Sonra - uygulamayı bir sonraki açışınızda - UTC'de kaydedilen tarihi okudum ve geçerli saat diliminizde aynı tarihe dönüştürüyorum - ör. UTC'de 8.00'i New York saat diliminde 8'e dönüştürüyorum.
Bu çözüm, tarihin ayarladığınız yere ve okuduğunuz yere bağlı olarak başka bir şey ifade edebileceği anlamına gelir, ancak her zaman aynı saat dilimindeymişsiniz gibi hissedecek şekilde sabit kalır.
Biraz kod yazalım:
İlk olarak - saat dilimini yoksaymak / UTC'yi dönüştürmek için 2 ana fonksiyonumuz var:
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(),
);
}
Sonra, bu tarihi aşağıdaki gibi kaydeder / okurum:
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
}