Giải pháp của tôi giữ cho ngày giống nhau bất kể múi giờ nào được đặt ở phía máy khách. Có lẽ ai đó sẽ thấy nó hữu ích.
Trường hợp sử dụng của tôi:
Tôi đang tạo một ứng dụng việc cần làm, nơi bạn đặt ngày thực hiện nhiệm vụ của mình. Ngày này sẽ không đổi cho dù bạn ở múi giờ nào.
Thí dụ. Bạn muốn gọi cho bạn mình vào lúc 8 giờ sáng ngày 25 tháng Sáu.
Bạn tạo nhiệm vụ này 5 ngày trước (ngày 20 tháng 6) khi bạn ở Trung Quốc.
Sau đó, cùng ngày, bạn bay đến New York trong vài ngày.
Sau đó, vào ngày 25 tháng 6, khi bạn vẫn ở New York, bạn thức dậy lúc 7:30 sáng (có nghĩa là bạn sẽ nhận được thông báo nhiệm vụ trong 30 phút (ngay cả lúc 1:30 chiều tại Trung Quốc, nơi bạn đang ở khi tạo ra bài tập)
Vì vậy, nhiệm vụ là bỏ qua múi giờ. Nó có nghĩa là 'Tôi muốn làm điều đó lúc 8 giờ sáng ở bất kỳ múi giờ nào tôi sẽ ở'.
Những gì tôi làm là hãy nói 'Tôi cho rằng bạn luôn ở múi giờ Luân Đôn - UTC'.
Điều đó có nghĩa là - khi người dùng chọn một số ngày trong Múi giờ của anh ấy / tôi - tôi chuyển đổi ngày này thành cùng một ngày trong UTC. I E. Bạn chọn 8 giờ sáng ở Trung Quốc, nhưng tôi chuyển đổi thành 8 giờ sáng ở UTC.
Sau đó - lần tới khi bạn mở ứng dụng - Tôi đọc ngày được lưu trong UTC và chuyển đổi nó thành cùng ngày trong múi giờ hiện tại của bạn - ví dụ: Tôi chuyển đổi 8 giờ sáng ở UTC sang 8 giờ sáng ở múi giờ New York.
Giải pháp này có nghĩa là ngày có thể có ý nghĩa khác tùy thuộc vào vị trí của bạn khi đặt nó và nơi bạn đang đọc nó, nhưng nó vẫn không đổi theo cách mà nó "cảm thấy" giống như bạn luôn ở trong cùng múi giờ.
Hãy viết một số mã:
Đầu tiên - chúng tôi có 2 chức năng chính để chuyển đổi từ / sang UTC bỏ qua múi giờ:
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(),
);
}
Sau đó, tôi lưu / đọc ngày này như:
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
}