Thật không có cách khắc phục nhanh cho việc này, thật không may. Quốc tế hóa một ứng dụng nên là một phần của các cuộc thảo luận thiết kế đầu tiên, vì nó thực sự đi vào cốt lõi của rất nhiều lĩnh vực khác nhau, bao gồm so sánh ngày / giờ và định dạng đầu ra.
Dù sao, để có được trên đường đua của Làm It Right, nó là điều cần thiết để lưu trữ các thông tin múi giờ với thời gian . Nói cách khác, nhận ra rằng ngày / giờ 20130407 14:50
là vô nghĩa nếu không có (a) bao gồm cả phần bù UTC hiện tại của múi giờ (ghi chú 1) hoặc (b) đảm bảo rằng tất cả logic chèn các giá trị này trước tiên sẽ chuyển đổi thành phần bù cố định nhất định ( rất có thể là 0). Không có một trong hai điều đó, hai giá trị thời gian nhất định là không thể so sánh được và dữ liệu bị hỏng . (Nhân tiện, phương pháp thứ hai là chơi với lửa (chú thích 2) , nhân tiện, đừng làm vậy.)
Trong SQL Server 2008+, bạn có thể lưu trữ phần bù theo thời gian trực tiếp bằng cách sử dụng datetimeoffset
kiểu dữ liệu. (Để đầy đủ, vào năm 2005 và trước đó, tôi sẽ thêm một cột thứ hai để lưu trữ giá trị bù UTC hiện tại (tính bằng phút).)
Điều này giúp ứng dụng loại máy tính để bàn dễ dàng, vì các nền tảng này thường có cơ chế tự động chuyển đổi ngày / giờ + múi giờ thành giờ địa phương và sau đó định dạng cho đầu ra, tất cả dựa trên cài đặt khu vực của người dùng.
Đối với web, vốn là một kiến trúc bị ngắt kết nối, ngay cả với dữ liệu phía sau được thiết lập đúng, nó phức tạp hơn vì bạn cần thông tin về máy khách để có thể thực hiện chuyển đổi và / hoặc định dạng. Điều này thường được thực hiện thông qua cài đặt tùy chọn người dùng (ứng dụng chuyển đổi / định dạng mọi thứ trước khi xuất) hoặc chỉ hiển thị những thứ có cùng định dạng cố định và bù múi giờ cho mọi người (đó là những gì nền tảng Stack Exchange hiện đang làm).
Bạn có thể thấy làm thế nào nếu dữ liệu back-end không được thiết lập đúng cách, rất nhanh nó sẽ trở nên phức tạp và khó tin. Tôi không khuyên bạn nên đi xuống bất kỳ con đường nào trong số đó vì bạn sẽ gặp nhiều vấn đề hơn.
Lưu ý 1:
Độ lệch UTC của múi giờ không cố định: xem xét tiết kiệm ánh sáng ban ngày trong đó độ bù UTC của vùng thay đổi theo cộng hoặc trừ một giờ. Ngoài ra ngày tiết kiệm ánh sáng ban ngày của khu vực khác nhau trên cơ sở thường xuyên. Vì vậy, sử dụng datetimeoffset
(hoặc tổng hợp local time
và UTC offset at that time
) cho kết quả phục hồi thông tin tối đa.
Lưu ý 2:
Đó là về việc kiểm soát dữ liệu đầu vào. Mặc dù không có cách nào để chứng thực các giá trị đến, nhưng tốt hơn hết là thực thi một tiêu chuẩn đơn giản không liên quan đến tính toán. Nếu API công khai mong đợi loại dữ liệu bao gồm phần bù, yêu cầu đó sẽ rõ ràng đối với người gọi.
Nếu đó không phải là trường hợp, người gọi phải dựa vào tài liệu (nếu họ đọc nó) hoặc tính toán được thực hiện không chính xác, v.v. Có ít chế độ lỗi / lỗi hơn khi yêu cầu bù, đặc biệt là cho hệ thống phân tán ( hoặc thậm chí chỉ web / cơ sở dữ liệu trên các máy chủ riêng biệt như trường hợp ở đây).
Lưu trữ phần bù dù sao cũng giết chết hai con chim bằng một hòn đá; và ngay cả khi điều đó không bắt buộc ngay bây giờ , nó sẽ giúp khả năng có sẵn sau này nếu cần thiết. Đúng là nó chiếm nhiều dung lượng hơn, nhưng tôi nghĩ rằng nó đáng để đánh đổi vì dữ liệu sẽ bị mất nếu nó không bao giờ được ghi lại ở vị trí đầu tiên.