在数据库中保存TimeZones的最佳实践是什么?


12

我们要开始为数据库中的每个地址收集时区。存储时区的最佳实践是什么?您将如何获取现有地址记录的时区?

我正在使用Microsoft SQL Server,.net mvc,C#。任何建议将不胜感激。



顺便说一句,通常的时区陷阱是使用int,但是某些时区可能是+或-30分钟,甚至15分钟:)哦,请记住,这不是一门精确的科学,夏令时可能会使您失望。
罗克兰

2
@LachlanB的一种表达方式是,时区更多的是位置,而不是时间偏移。但是,即使仅靠这种观点,还是不够的,例如,俄罗斯最近改变了关于夏令时的政策,这意味着您必须根据实际日期对其进行区别对待。
Daniel B

Answers:


7

您想要存储的东西不会一直(或一年两次)保持不变。时区数据库https://en.wikipedia.org/wiki/List_of_tz_database_time_zones完全正确。因此,您只需存储两个字母。

您可以从该数据库查询时间偏移,以及夏令时处于活动状态时。它不仅是时间偏移,而且还为您提供了一个区域,因此在同一纬度上的许多地方将具有不同的代码,并且可以分别更改其时区规则,并且您的软件将能够处理该时区。

唯一需要更改数据库的时间是位置更改其所属的时区时,这种情况很少见。


请注意,维基百科上的列表并不包含所有 IANA时区的2个字符的缩写,而且映射也不是唯一的。如果您需要完整的历史信息,请改用全名。
绿巨人

2
我在Wikipedia页面上看到的唯一两个字母代码是国家代码。这些没有唯一定义时区。例如,美国的所有时区都具有相同的两个字母的国家/地区代码:US。同样,澳大利亚各地都有国家代码AU。
伊恩(Ian)2013年

3

绝对的最佳实践是使用支持TIMESTAMP WITH TIMEZONESQL99定义的数据类型的数据库。

SQL Server有一个名为的类型datetimeoffsetTIMESTAMP WITH TIMEZONE除了存储实际时区外,其他所有功能都可以做。您所能做的就是存储UTC的偏移量(例如2013-05-04 12:34:56 -5:00),这意味着您必须在存储之前根据时区确定偏移量。


3

假设您使用的是.Net Framework 4.0或更高版本,则需要使用TimeZoneInfo

将所有日期值以UTC格式存储在数据库中。为每个客户端使用ID值或ToSerializedString()的结果来创建TimeZoneInfo对象,以将存储的日期转换为本地格式以进行显示。


2

您已经说过要为数据库中的每个地址存储一个时区,但尚未说明要使用的时区。在数据库中存储内容本身很少是目的。

无论如何,我都会直接或通过使用一些集成TZ的现成软件来使用TZ数据库(又名Olsen数据库)。您可以将时区简单地存储为字符串以引用TZ DB条目之一,例如“非洲/坎帕拉”或“欧洲/巴黎”。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.