代码之家  ›  专栏  ›  技术社区  ›  Daniel Spiewak

表示夏季规则的最佳方式是什么?

  •  6
  • Daniel Spiewak  · 技术社区  · 16 年前

    我需要在数据库中存储世界不同地区的夏季(夏令时)转换规则。我已经有了存储区域和子区域的方法(因此 "half of Australia"/Arizona/Navaho 问题已经解决了),但我想知道实现这一点最有效的模式是什么。我看到的两个选项是:

    • 有一个表格,其中包含每年和地区的唯一一行,给出夏季的开始和结束时间以及具体的偏移量
    • 有一个表格,其中存储每个地区的公式和生效日期范围(以色列等地区需要有效范围)

    任何东西 这是可能的。不幸的是,它还需要(a)更多的空间,相应地(b)大量的工作来获得数据输入。第二个很好,因为一行可以对应一个区域几十年,但它也需要应用层中的某种语言解析器和解释器。由于这个数据库将由几个不同的应用程序使用,这些应用程序都是用没有强大文本处理功能的语言编写的,因此我宁愿避免使用这种方法。

    我希望只使用zoneinfo或类似的东西,但不幸的是,在这种情况下,这不是一个选项。同样地,我无法规范日期、时区和夏季时间信息 必须 在数据库中,以满足某些用例。

    有人做过类似的事情吗?同样,有没有人有我可能错过的精彩选择?

    4 回复  |  直到 16 年前
        1
  •  16
  •   Zathrus    16 年前

    你几乎注定要做第一个选择。对于有时间变更“规则”的国家,您可以提前任意时间生成日期,但某些地区没有任何规则,这些变更每年都通过独裁法令或立法投票进行(巴西直到今年才这样做)。

    这就是为什么所有操作系统供应商每年都会推出一到两次时区文件更改——他们必须这样做,因为他们无法通过编程生成100%准确的文件。

        2
  •  4
  •   JesperE    16 年前

        3
  •  2
  •   Jonathan Leffler    7 年前

    elsie.nci.nih.gov . 2008年9月,数据的当前版本是tzdata2008f.tar.gz,代码的当前版本是tzcode2008e.tar.gz(是的,数据发布时代码并不总是发布)。这往往是许多其他系统(尤其包括Oracle信息)的信息源。还有一个邮件列表。如你所见,到目前为止,2008年的数据有六个版本;我的机器上潜伏着2005r、2006l、2007k的副本,所以情况可能会经常变化。

    如今(2017年3月),奥尔森数据库可从IANA获得,见 https://iana.org/time-zones ftp://ftp.iana.org/tz (特别是 ftp://ftp.iana.org/tz/releases ).

    CLDR 它也有关于时区的信息。

        4
  •  1
  •   pappes    16 年前

    Oracle DBMS会自动为您处理此问题。日期存储在一个内部表示形式中(为了参数,让我们想象一下UMT),并在转换为字符串时根据时区规则进行格式化。

    这也解决了随着时间的推移在变更过程中应该做什么的争论。也就是说,当您将时钟向后拨1/2小时时,实际上在同一天有两个3:25 am的实例。