โซลูชันของฉันรักษาวันที่เหมือนกันไม่ว่าเขตเวลาใดจะถูกตั้งค่าไว้ที่ฝั่งไคลเอ็นต์ บางทีบางคนอาจพบว่ามีประโยชน์
กรณีการใช้งานของฉัน:
ฉันกำลังสร้างแอปสิ่งที่ต้องทำที่คุณกำหนดวันที่ของงานของคุณ วันนี้ควรคงที่ไม่ว่าคุณจะอยู่ในเขตเวลาใด
ตัวอย่าง. คุณต้องการโทรหาเพื่อนของคุณเวลา 8.00 น. ของวันที่ 25 มิถุนายน
คุณสร้างงานนี้ 5 วันก่อน (วันที่ 20 มิถุนายน) ในขณะที่คุณอยู่ในประเทศจีน
จากนั้นในวันเดียวกันคุณบินไปนิวยอร์กสองสามวัน
จากนั้นในวันที่ 25 มิถุนายนในขณะที่คุณยังอยู่ในนิวยอร์กคุณตื่นนอนเวลา 7:30 น. (ซึ่งหมายความว่าคุณควรได้รับการแจ้งเตือนงานใน 30 นาที (แม้จะเป็น 13:30 น. แล้วในประเทศจีนที่คุณอยู่) งาน)
ดังนั้นงานจะข้ามเขตเวลา มันหมายความว่า 'ฉันต้องการที่จะทำเวลา 08:00 น. ในเขตเวลาใดก็ตามที่ฉันจะเข้าไป'
สิ่งที่ฉันทำคือสมมุติว่า 'ฉันคิดว่าคุณอยู่ในเขตเวลาของลอนดอน - UTC' เสมอ
หมายความว่าอะไร - เมื่อผู้ใช้เลือกวันที่ในเขตเวลาของเขา / เธอ - ฉันแปลงวันที่นี้เป็นวันที่เดียวกันใน UTC กล่าวคือ คุณเลือกเวลา 8.00 น. ในประเทศจีน แต่ฉันแปลงเป็นเวลา 8:00 น. ใน UTC
จากนั้น - ครั้งต่อไปที่คุณเปิดแอป - ฉันอ่านวันที่บันทึกใน UTC และแปลงเป็นวันที่เดียวกันในเขตเวลาปัจจุบันของคุณ - ฉันแปลงเวลา 8.00 น. ใน UTC เป็นเวลา 8:00 น. ในเขตเวลานิวยอร์ก
วิธีการแก้ปัญหานี้หมายความว่าวันที่อาจมีความหมายอย่างอื่นขึ้นอยู่กับว่าคุณอยู่ที่ไหนเมื่อคุณตั้งค่าและที่ที่คุณกำลังอ่าน แต่มันยังคงคงที่ในลักษณะที่ 'รู้สึก' เหมือนคุณอยู่ในเขตเวลาเดียวกันเสมอ
ลองเขียนโค้ดกัน:
ครั้งแรก - เรามี 2 ฟังก์ชั่นหลักสำหรับการแปลงจาก / เป็น 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
}