2010-08-10 82 views
12

我知道有點誤導性的標題。從來沒有真的想要自己存儲TimeZoneInfo對象:相反,我想存儲一些與文化無關的標識符,然後可以稍後用它來重建TimeZoneInfo的實例。如何將TimeZoneInfo對象存儲在數據庫中?

目前,我存儲的值爲TimeZoneInfo.Id屬性,它似乎可以同時在英文和俄文版本的Windows上運行,但我只是想確保我做的是正確的事情。

+0

不確定,但檢查這可能會幫助你:http://blog.sqlauthority.com/2010/07/15/sql-server-datetime-function-switchoffset-example/ – 2010-08-10 07:33:11

+0

相關問題 - http:// stackoverflow。 COM /問題/ 2532729 /日光節約時間,和時區最佳實踐 – Oded 2010-08-10 07:34:03

回答

16

是,Id是一個非本地化的標識符,所以這是一個合適的東西來存儲。

你應該知道,雖然一個可能出現的問題:標識符可以隨時間而改變。我不知道它是否是在的Windows時區標識符的問題,但它確實發生在奧爾森(區信息)的數據庫。例如,我最近看到由「太平洋/波納佩」改爲「太平洋/波納佩」造成的問題。

我懷疑,微軟擁有的ID更嚴格的控制,他們更可能保持不變 - 但即便如此,國家可以改變他們的名字,分裂成不同的國家(有可能創造新的時區)等

我不建議任何修復這個問題 - 只是強調它作爲一個潛在的問題。存儲ID可能是目前最好的辦法,但要注意潛在的風險...

+0

有一個整數對應的字符串ID爲的TimeZoneInfo?想知道他們爲什麼沒有爲Id提供一個int? – 2011-08-28 21:41:24

+0

@ ray247:我不知道時區ID和整數之間的映射。 – 2011-08-29 07:08:30

+1

@Jon - 我知道這很糟糕,但我讀了第一個答案。看到它是你的,我甚至懶得讀其餘的。 Jon Skeet有沒有過濾器可以回答? – 2013-03-04 21:00:23

10

我沒有看到存儲ID的問題,因爲它們在整個Windows平臺上看起來是一個常數值 - 也就是說,無論哪個版本的Windows,特定的ID將始終映射到相同的TimeZoneInfo對象你用。

我不知道做什麼單,但我不會感到驚訝,如果這將是相同的。你總是可以檢查class source code

0

檢查這兩種方法

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

這些應該保留儘可能多的信息儘可能:)

+1

當然,但這些序列化的表示文化不可知論? – 2010-08-10 13:32:32

-2

我只需使用TimeZoneInfo.Id.GetHashCode()。根據測試,這會生成唯一的整數ID,可以存儲在數據庫中。您還可以使用密鑰作爲字典來構建這些哈希代碼,並將值作爲原始ID字符串,以便於進行反向查找。

+0

當然這只是散列Id字符串。如果底層字符串根據上面標記的答案更改;散列會改變。 – ProVega 2014-06-19 15:50:04

相關問題