gpt4 book ai didi

javascript - 如何序列化 Ruby 的 TZInfo 数据?

转载 作者:行者123 更新时间:2023-12-04 04:54:25 25 4
gpt4 key购买 nike

我有一个 Rails 应用程序,与所有 Rails 应用程序一样,它使用 Ruby 的 TZInfo时区信息库。这个库使用了 Olson 风格的信息,但它的实现实际上并不解析 Olson 文件。定义在 Ruby 中。

我想确保我的服务器和客户端使用相同的时区数据,以便用户不会遇到任何意外。具体来说,我们在 Ruby 中修补 TZInfo 数据的速度比 gem 的新版本快得多。因此,我考虑并拒绝了以下内容:

  • 使用内置时区信息的 JavaScript 库。 Ruby 和 JavaScript 库的数据会有所不同。
  • 暴露内容/usr/share/zoneinfo/*来自我的 API。 ruby 和 zoneinfo数据会出现分歧。

  • 这让我有两个选择:
  • 重写或修补 TZInfo实际解析来自 /usr/share/zoneinfo/* 的文件
  • 想出一个序列化的方法 TZInfoTimeZone对象转换为 JavaScript、JSON、YAML 或其他有用的格式

  • 仅仅告诉客户端当前时区偏移是不够的,因为客户端需要为历史(和 future )日期生成时间戳。

    最佳答案

    在实现相同版本的 IANA 时区数据库的服务器和客户端上使用库。当前版本(在我写这篇文章时)是 2013c,可以在它的原始版本中找到 here .

    在服务器端,使用 TZInfo library对于 ruby 。它有两颗 gem ,tzinfo gem ,以及 tzinfo-data gem .

    如果您查看 tzinfo-data 文档,您会看到有一个 Version与 IANA 版本匹配的属性。所以 tzinfo-data 2013.3 显示了 IANA 版本 2013c,它也显示在 this page 的文档中.

    您在评论中提到数据是硬编码的。这不完全正确。它不是硬编码的,而是代码生成的。当你看到the ruby files使用“硬编码”时区数据,它们实际上是使用 the original IANA source files 生成的.有a custom parser执行此操作,以便每次发布新版本的 IANA 时区数据库时,都可以生成并发布对 tzinfo-data 的相应更新。

    在客户端,您可以使用 several different libraries 中的任何一个.大多数人会做完全相同的事情——从相同的 IANA 来源开始,然后代码生成一个对网络有意义的文件。通常,这是一个 JSON 文件。

    让我们以其中一个库为例 - Walltime-js .

    我们可以看到on github他们已链接到 IANA/Olson tzdb sources在github上。我们可以通过从 git 中查看精确版本来确保我们使用的是完全相同的 2013c 源数据。

  • commit history对于 tzdb。
  • 发现在 2013 年 4 月 19 日,有一条评论指出版本 2013c。
  • IANA 验证 2013c 的发布是 2013 年 4 月 20 日。
  • 所以我们知道 2013c 的提交 ID 是 f599ad15ce。
  • (是的,如果他们使用 git 标签会更容易,但出于某种原因他们没有这样做)。

  • 最终,我们最终生成了 walltime-data.js文件,通过关注他们的 build instructions ,进行一个小改动以确保我们拥有完全相同的 2013c 源数据。新构建看起来像这样:
    git submodule init && git submodule update
    git submodule foreach 'git checkout f599ad15ce'
    cake data

    现在我们有一个从 TZDB 2013c 构建的 walltime-data.js 文件。这将归结到客户端并由 walltime.js 使用。

    我们还有 2013c 的 tzinfo-data gem,它将位于服务器上并由 Ruby 中的 tzinfo 使用。

    所以它们之间唯一需要传输的数据就是时区的id,比如 America/Los_Angeles .每个库都将使用自己的数据副本和自己的实现,但您可以相信它们指的是同一件事。

    唯一可能使它们行为不同的原因是它们解释数据的方式是否存在错误,无论是在解析器中还是在运行时。这样的错误应该引起作者的注意。但唯一可能避免它们的方法是在两个地方运行完全相同的代码和数据——这意味着在服务器上使用 Node.js 而不是 Ruby。

    关于javascript - 如何序列化 Ruby 的 TZInfo 数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16972427/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com