Cách thực hành tốt nhất để lưu TimeZones trong cơ sở dữ liệu là gì?


12

Chúng tôi muốn bắt đầu thu thập các múi giờ cho từng địa chỉ của chúng tôi trong cơ sở dữ liệu. Thực hành tốt nhất để lưu trữ các múi giờ là gì? Làm thế nào bạn sẽ đi về việc có được múi giờ cho các bản ghi địa chỉ hiện có?

Tôi đang sử dụng máy chủ Microsoft SQL, .net mvc, C #. Bất kỳ đề xuất sẽ được đánh giá rất cao.



Btw một gotcha múi giờ bình thường là sử dụng int, nhưng một số múi giờ có thể là + hoặc - 30 phút, hoặc thậm chí 15 phút :) Ồ và hãy nhớ rằng đó không phải là một môn khoa học chính xác, tiết kiệm ánh sáng ban ngày và những thứ đó có thể làm bạn thất vọng.
Rocklan

2
@LachlanB một cách để đặt nó là múi giờ là một vị trí nhiều hơn là thời gian bù . Nhưng ngay cả quan điểm đó cũng không đủ, chẳng hạn, gần đây, Nga đã thay đổi chính sách của họ về tiết kiệm ánh sáng ban ngày, nghĩa là bạn phải đối xử với nó khác nhau tùy thuộc vào ngày thực tế.
Daniel B

Câu trả lời:


7

Bạn muốn lưu trữ thứ gì đó không thay đổi mọi lúc (hoặc hai lần một năm). Cơ sở dữ liệu múi giờ https://en.wikipedia.org/wiki/List_of_tz_database_time_zones chính xác là điều đúng đắn. Vì vậy, bạn chỉ cần lưu trữ hai chữ cái.

Từ cơ sở dữ liệu này, bạn có thể yêu cầu bù thời gian và khi thời gian tiết kiệm ánh sáng ban ngày được kích hoạt. Nó không chỉ là thời gian bù mà còn cung cấp cho bạn một khu vực, vì vậy nhiều nơi có cùng vĩ độ sẽ có các mã khác nhau và có thể thay đổi riêng quy tắc múi giờ của họ và phần mềm của bạn sẽ có thể xử lý.

Lần duy nhất khi bạn cần thực hiện thay đổi trong cơ sở dữ liệu của mình là khi một vị trí thay đổi múi giờ mà nó thuộc về, điều này sẽ rất hiếm.


Lưu ý rằng danh sách trên wikipedia không chứa các chữ viết tắt 2 ký tự cho tất cả các múi giờ IANA - cộng với ánh xạ không rõ ràng. Nếu bạn cần thông tin lịch sử đầy đủ, thay vào đó hãy tìm tên đầy đủ.
Hulk

2
Hai mã chữ cái duy nhất tôi thấy trên trang Wikipedia là mã quốc gia. Đây không xác định duy nhất múi giờ. Ví dụ: tất cả các múi giờ ở Hoa Kỳ có cùng mã quốc gia gồm hai chữ cái: US. Tương tự, tất cả trên khắp nước Úc đều có mã quốc gia AU.
Ian

3

Cách thực hành tốt nhất tuyệt đối sẽ là sử dụng cơ sở dữ liệu hỗ trợ TIMESTAMP WITH TIMEZONEkiểu dữ liệu được xác định bởi SQL99.

SQL Server có một loại được gọi là datetimeoffsetmọi thứ TIMESTAMP WITH TIMEZONEcó thể làm ngoại trừ lưu trữ múi giờ thực tế. Tất cả những gì bạn có thể làm là lưu trữ phần bù từ UTC (ví dụ 2013-05-04 12:34:56 -5:00:), điều đó có nghĩa là bạn sẽ phải xác định điều đó trước khi lưu trữ dựa trên múi giờ.


3

Giả sử rằng bạn đang sử dụng .Net framework 4.0 trở lên, TimeZoneInfo là thứ bạn cần.

Lưu trữ tất cả các giá trị ngày trong cơ sở dữ liệu ở định dạng UTC. Sử dụng giá trị ID hoặc kết quả của ToSerializedString () cho mỗi máy khách để tạo đối tượng TimeZoneInfo để chuyển đổi ngày được lưu trữ sang định dạng cục bộ để hiển thị.


2

Bạn đã nói rằng bạn muốn lưu trữ múi giờ cho từng địa chỉ trong DB của mình, nhưng bạn chưa nói bạn muốn làm gì với địa chỉ đó. Lưu trữ một cái gì đó trong DB hiếm khi tự nó kết thúc.

Trong mọi trường hợp, tôi sẽ sử dụng cơ sở dữ liệu TZ , còn gọi là cơ sở dữ liệu Olsen, trực tiếp hoặc bằng cách sử dụng một số phần mềm có sẵn tích hợp TZ. Bạn có thể lưu trữ múi giờ đơn giản dưới dạng chuỗi để chỉ một trong các mục TZ DB , ví dụ: 'Châu Phi / Kampala' hoặc 'Châu Âu / Paris'.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.