C# 通用时区

C# 通用时区,c#,timezone,C#,Timezone,我想提供一个时区的DB表,以便UI用户可以与其中一个时区相关联,并希望了解有关存储这些时区的最佳实践的视图。显然,我们可以将windows或tzid区域名称存储为键,但这似乎是错误的,我不喜欢在数据库中存储特定于平台的信息。这些信息来自一个API,Java或windows客户端可能会使用该API,因此向Java客户端提供windows时区似乎是错误的。是否有公认的ISO标准(或类似)时区代码列表可作为主键使用 我偶然发现: 但我不确定它是否对我有帮助 是的,IANA维护定义这些标识符的一组时区

我想提供一个时区的DB表,以便UI用户可以与其中一个时区相关联,并希望了解有关存储这些时区的最佳实践的视图。显然,我们可以将windows或tzid区域名称存储为键,但这似乎是错误的,我不喜欢在数据库中存储特定于平台的信息。这些信息来自一个API,Java或windows客户端可能会使用该API,因此向Java客户端提供windows时区似乎是错误的。是否有公认的ISO标准(或类似)时区代码列表可作为主键使用

我偶然发现:

但我不确定它是否对我有帮助

是的,IANA维护定义这些标识符的一组时区信息


要获得有保证的权威数据集,请下载最新的软件包,并解析时区名称的
zone.tab
文件。

您的问题中有几项我想评论一下:

我想提供一个时区的DB表,以便UI用户可以与其中一个时区相关联,并希望了解有关存储这些时区的最佳实践的视图

您不应该尝试在数据库中构建时区表。时区不是静态的。它们不断变化。如果你使用Windows时区,你可以通过Windows Update获得这些更新,如果你使用IANA时区,你应该是你自己。无论哪种方式,每年都有多个更新,您不应该依赖可能失去同步的辅助数据源

如果使用的是Windows区域,请迭代
TimeZoneInfo.GetSystemTimeZones()
,显示
DisplayName
属性,并将
Id
属性与用户关联

如果您正在.Net中使用IANA区域,您(希望)正在使用,并且您会将IANA区域名称与您的用户关联(例如,
America/Los_Angeles
)。您可以在单个列表中向用户显示这些信息,或按国家/地区代码进行过滤,或使用基于地图的时区选择器。请阅读更多详情

也可以读到

显然,我们可以将windows或tzid区域名称存储为密钥,但这似乎是错误的

如果使用Windows区域,则存储
Id
(例如,
东部标准时间
)。如果使用IANA区域,则存储全名(例如,
America/New_York
)。这是没有办法的,这确实是最好的做法

另请参见,这基本上是相同的问题,但从PHP的角度来看

我不喜欢在数据库中存储特定于平台的信息。这些信息来自一个API,Java或windows客户端可能会使用该API,因此向Java客户端提供windows时区似乎是错误的

只有Windows区域是特定于平台的。如果您使用的是IANA区域,那么在任何平台上都可以。如果您的应用程序已经深深地绑定到Windows区域,那么您可以使用找到的CLDR映射来转换它们。这些也是野田佳彦的时代。如果需要,可以存储Windows时区ID,并在外部API中动态转换。或者,您可以只转换一次,然后继续使用IANA区域

是否有公认的ISO标准(或类似)时区代码列表


没有。时区没有标准。最接近的是IANA数据库。它几乎在所有地方都得到实施。我建议您在中阅读更多内容。

谢谢,这看起来是正确的答案(虽然不太好——我们无法准确地引导客户)。