2010-08-10 41 views
12

Tiêu đề gây hiểu nhầm hơi, tôi biết. Không bao giờ thực sự muốn lưu trữ TimeZoneInfo đối tượng mình: thay vào đó, tôi muốn lưu trữ một số định danh văn hóa trung tính, sau đó có thể được sử dụng để xây dựng lại một thể hiện của TimeZoneInfo.Làm thế nào để lưu trữ các đối tượng TimeZoneInfo trong cơ sở dữ liệu?

Hiện tại, tôi đang lưu trữ giá trị của tài sản TimeZoneInfo.Id và có vẻ như không sao cả trên các phiên bản tiếng Anh và tiếng Nga của Windows, nhưng tôi chỉ muốn đảm bảo tôi làm đúng.

+0

không chắc chắn nhưng việc kiểm tra điều này có thể giúp bạn: http://blog.sqlauthority.com/2010/07/15/sql-server-datetime-function-switchoffset-example/ –

+0

Câu hỏi liên quan - http: // stackoverflow. com/questions/2532729/daylight-saving-time-and-timezone-best-practices-thực hành – Oded

Trả lời

16

Có, Id là số nhận dạng không được bản địa hóa, do đó, đó là điều phù hợp để lưu trữ.

Bạn nên biết một vấn đề có thể xảy ra mặc dù: số nhận dạng có thể thay đổi theo thời gian. Tôi không biết đây có phải là sự cố trong số Windows số nhận dạng múi giờ hay không, nhưng nó chắc chắn xảy ra trong cơ sở dữ liệu Olson (zoneinfo). Ví dụ, gần đây tôi đã xem xét một vấn đề gây ra bởi "Pacific/Ponape" thay đổi thành "Pacific/Pohnpei".

Tôi nghi ngờ rằng khi Microsoft kiểm soát chặt chẽ hơn ID, chúng có nhiều khả năng vẫn giữ nguyên - nhưng ngay cả như vậy, các quốc gia có thể đổi tên, chia thành các quốc gia khác nhau (có khả năng tạo múi giờ mới), v.v.

Tôi không đề xuất bất kỳ sửa lỗi nào cho vấn đề này - chỉ cần đánh dấu nó là một vấn đề tiềm ẩn. Lưu trữ các ID có lẽ là phương pháp tốt nhất có sẵn, nhưng nhận thức được những rủi ro tiềm ẩn ...

+0

Có sự tương ứng số nguyên nào với Id chuỗi cho TimeZoneInfo không? Tự hỏi tại sao họ không cung cấp một int cho Id? –

+0

@ ray247: Tôi không biết bất kỳ ánh xạ nào giữa ID múi giờ và số nguyên. –

+1

@Jon - Tôi biết điều này là xấu nhưng tôi đọc câu trả lời đầu tiên. Thấy nó là của bạn và tôi thậm chí không bận tâm để đọc phần còn lại. Có một bộ lọc để trả lời bởi Jon Skeet? –

10

Tôi không thấy vấn đề với việc lưu trữ ID, vì chúng có vẻ là giá trị không đổi trên nền tảng cửa sổ - tức là ID cụ thể sẽ luôn được ánh xạ tới cùng một đối tượng TimeZoneInfo, bất kể phiên bản cửa sổ nào bạn dùng.

Tôi không chắc chắn về những gì mono làm, nhưng tôi sẽ không ngạc nhiên nếu điều này sẽ giống nhau. Bạn luôn có thể kiểm tra class source code.

0

séc hai phương pháp này

public static System.TimeZoneInfo FromSerializedString(string source) 
public string ToSerializedString() 

những nên bảo tồn càng nhiều thông tin càng tốt :)

+1

Chắc chắn, nhưng những đại diện được công bố hóa học này có phải là sự bất khả tri không? –

-2

tôi chỉ cần sử dụng TimeZoneInfo.Id.GetHashCode(). Theo các bài kiểm tra, điều này tạo ra số nguyên duy nhất của ID có thể được lưu trữ trong một DB. Bạn cũng có thể xây dựng một từ điển với các khóa là các mã băm và các giá trị này là các chuỗi ID gốc để giúp việc tra cứu ngược lại dễ dàng hơn.

+0

Tất nhiên điều này chỉ băm chuỗi Id. Nếu chuỗi cơ bản thay đổi theo câu trả lời được đánh dấu ở trên; băm sẽ thay đổi. – ProVega

Các vấn đề liên quan