2010-08-10 85 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

相关问题