如何在数据库中存储TimeZoneInfo对象?

时间:2010-08-10 07:30:56

标签: .net database timezone

我知道有些误导性的标题。从来没有真正想要自己存储TimeZoneInfo对象:相反,我想存储一些与文化无关的标识符,然后可以将其用于重建TimeZoneInfo的实例。

目前,我正在存储TimeZoneInfo.Id属性的值,它在英语和俄语版本的Windows上似乎都没问题,但我只是想确保我做对了。

4 个答案:

答案 0 :(得分:16)

是的,Id是一个非本地化的标识符,因此这是一个适当的存储方式。

您应该知道一个可能的问题:标识符可能会随时间而变化。我不知道它是否是 Windows 时区标识符中的问题,但它确实发生在Olson(zoneinfo)数据库中。例如,我最近看到由“太平洋/ Ponape”改为“太平洋/波纳佩”引起的问题。

我怀疑,由于微软对ID有更严格的控制,它们更可能保持不变 - 但即便如此,各国也可以更改其名称,分成不同的国家(可能会创建新的时区)等。

我不建议针对此问题进行任何修复 - 只是将其强调为潜在问题。存储ID可能是最好的方法,但要注意潜在的风险......

答案 1 :(得分:10)

我没有看到存储ID的问题,因为它们在Windows平台上看起来是一个常量值 - 也就是说,特定ID将始终映射到同一个TimeZoneInfo对象,无论哪个您使用的Windows版本。

我不确定单声道是做什么的,但如果情况相同,我也不会感到惊讶。您随时可以查看class source code

答案 2 :(得分:0)

检查这两种方法

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

这些应该保留尽可能多的信息:)

答案 3 :(得分:-2)

我只使用了TimeZoneInfo.Id.GetHashCode()。根据测试,这会生成唯一的整数ID,可以存储在DB中。您还可以构建一个字典,其中键是这些哈希码,值是原始ID字符串,以便更容易进行反向查找。