Trước tiên, hãy nhận ra rằng trong thuật ngữ hiện đại, bạn nên nói UTC thay vì GMT. Chúng hầu như tương đương nhau, ngoại trừ UTC được định nghĩa chính xác hơn. Đặt trước thuật ngữ GMT để chỉ phần múi giờ ở Vương quốc Anh có hiệu lực trong những tháng mùa đông có chênh lệch UTC + 0.
Bây giờ đến câu hỏi của bạn. UTC không nhất thiết là cách tốt nhất để lưu trữ tất cả các giá trị ngày và giờ. Nó hoạt động đặc biệt tốt cho quá khứ sự kiện hoặc cho tuyệt đối trong tương lai sự kiện, nhưng nó không hoạt động tốt cho địa phương trong tương lai sự kiện - đặc biệt là định kỳ trong tương lai sự kiện.
Tôi đã viết về điều này trên một câu trả lời khác gần đây, và là một trong số ít trường hợp ngoại lệ trong đó giờ địa phương có ý nghĩa hơn UTC. Đối số chính là "vấn đề đồng hồ báo thức". Nếu bạn đặt đồng hồ báo thức theo giờ UTC, bạn sẽ thức dậy sớm hoặc muộn một giờ vào ngày chuyển đổi DST. Đây là lý do tại sao hầu hết mọi người đặt đồng hồ báo thức của họ theo giờ địa phương.
Tất nhiên, bạn không thể chỉ lưu trữ giờ địa phương nếu bạn đang làm việc với dữ liệu từ khắp nơi trên thế giới. Bạn nên lưu trữ một số thứ khác nhau:
- Giờ địa phương của sự kiện lặp lại, chẳng hạn như "08:00"
- Múi giờ mà giờ địa phương được biểu thị, chẳng hạn như "America / New_York"
- Dạng lặp lại, ở bất kỳ định dạng nào có ý nghĩa đối với ứng dụng của bạn, chẳng hạn như hàng ngày, hai tuần một lần hoặc thứ Năm của tuần thứ ba trong tháng, v.v.
- Tiếp theo ngay lập tức Tương đương với ngày và giờ UTC, ở mức tốt nhất mà bạn có thể chiếu.
- Có lẽ, nhưng không phải lúc nào, danh sách ngày và giờ UTC của sự kiện trong tương lai, dự kiến một số khoảng thời gian được xác định trước trong tương lai (có thể là một tuần, có thể là 6 tháng, có thể là một hoặc hai năm, tùy thuộc vào nhu cầu của bạn).
Đối với hai điều cuối cùng, hãy hiểu rằng UTC tương đương với bất kỳ ngày / giờ địa phương nào có thể thay đổi nếu chính phủ chịu trách nhiệm về múi giờ đó quyết định thay đổi bất kỳ điều gì. Vì có nhiều bản cập nhật cơ sở dữ liệu múi giờ hàng năm, bạn sẽ muốn có kế hoạch đăng ký nhận thông báo về các bản cập nhật và cập nhật cơ sở dữ liệu múi giờ của bạn thường xuyên. Bất cứ khi nào bạn cập nhật dữ liệu múi giờ của mình, bạn sẽ cần phải tính toán lại thời gian tương đương theo giờ UTC của tất cả các sự kiện trong tương lai.
Việc có các giá trị tương đương với UTC là rất quan trọng nếu bạn định hiển thị bất kỳ loại danh sách sự kiện nào trải dài hơn một múi giờ. Đó là những giá trị bạn sẽ truy vấn để tạo danh sách đó.
Một điểm khác cần xem xét là nếu một sự kiện được lên lịch theo giờ địa phương xảy ra trong quá trình chuyển đổi dự phòng DST, bạn sẽ phải quyết định xem sự kiện đó xảy ra ở trường hợp đầu tiên (thường) hay trường hợp thứ hai (đôi khi), hoặc cả hai (hiếm khi) và xây dựng vào ứng dụng của bạn một cơ chế để đảm bảo sự kiện không kích hoạt hai lần trừ khi bạn muốn.
Nếu bạn đang tìm kiếm một câu trả lời đơn giản - xin lỗi, nhưng không có. Lên lịch cho các sự kiện trong tương lai giữa các múi giờ là một công việc phức tạp.
Phương pháp tiếp cận thay thế
Tôi đã có một vài người chỉ cho tôi một kỹ thuật mà họ làm sử dụng thời gian UTC để lập lịch, nghĩa là họ chọn ngày bắt đầu theo giờ địa phương, chuyển đổi ngày đó sang UTC sẽ được lưu trữ và cũng lưu trữ cả ID múi giờ. Sau đó, trong thời gian chạy, họ áp dụng múi giờ để chuyển đổi giờ UTC ban đầu trở lại giờ địa phương, sau đó sử dụng giờ địa phương đó để tính toán các lần lặp lại khác, như thể nó được lưu trữ ban đầu như trên.
Mặc dù kỹ thuật này sẽ hoạt động , những hạn chế là:
-
Nếu có một bản cập nhật múi giờ thay đổi giờ địa phương trước khi phiên bản đầu tiên được chạy, nó sẽ loại bỏ toàn bộ lịch trình. Điều này có thể được giảm thiểu bằng cách chọn một thời điểm trong quá khứ cho trường hợp "đầu tiên", sao cho trường hợp thứ hai thực sự là trường hợp đầu tiên.
-
Nếu thời gian thực sự là "thời gian trôi" theo dõi người dùng (chẳng hạn như trong đồng hồ báo thức trên điện thoại di động), bạn vẫn phải lưu trữ thông tin múi giờ cho vùng mà nó được tạo ban đầu - ngay cả khi đó không phải là khu vực bạn muốn tham gia.
-
Nó làm tăng thêm sự phức tạp mà không có bất kỳ lợi ích nào. Tôi muốn dành kỹ thuật này cho các tình huống mà bạn có thể đã có một bộ lập lịch chỉ UTC mà bạn đang cố gắng trang bị thêm hỗ trợ múi giờ vào.