【问题标题】:How can I capture the original timezone of an iso8601 datetime?如何捕获 iso8601 日期时间的原始时区?
【发布时间】:2011-03-10 03:47:26
【问题描述】:

我的 rails 3 应用需要与外部网络服务交互。此网络服务提供有关整个美国的降雨事件的信息(最终国家无关紧要)。相关信息是格式为 ISO8601 的开始/结束时间,包括时区。该服务器将在美国东海岸运行(因此是 EST,即将成为 EDT)。所有数据库条目都将存储为 UTC。

我需要能够存储事件发生的时区 (TZ),因此我向用户提供了在他们自己的 TZ 或原始 TZ 中查看事件的选项。一旦他们到达该位置,他们就不会关心事件是否基于他们的 HOME TZ 开始,而是基于事件发生的 TZ。

输入数据:

start = "2011-04-08T10:00:00-06:00"
  end = "2011-04-08T16:00:00-06:00"

#fyi
Time.zone => GMT-05:00 Eastern Time US  Canada

# Server time zone, original time zone lost !!!!
Time.parse(start) => 2011-04-08 12:00:00 -0400

# UTC, time zone lost
Time.zone.parse("2011-04-08T10:00:00-06:00") => Fri, 08 Apr 2011 16:00:00 UTC 00:00

我看不到任何方法(减去手动字符串操作)来获得原始的 -06:00 TZ (MST)。我真的希望有一种 RoR 方式来获取这些信息......似乎应该有一种方式!

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 timezone


    【解决方案1】:

    如果你使用Time,你会丢失信息,但如果你使用DateTime,你会没事的:

    DateTime.parse("2011-04-08T10:00:00-06:00")
    # => Fri, 08 Apr 2011 10:00:00 -0600
    

    DateTime 类比Time 健壮得多,并且可以编码更多信息,但速度较慢且更占用内存。幸运的是,除非您将大部分时间花在大批量操作中处理此类值,否则性能不会成为问题。

    【讨论】:

    • 完美!使用 zone 和 offset 方法,我可以获得我需要的东西。不知道为什么我没有找到这个......日期/时间 + TZ 在 ruby​​ 和 rails 中似乎都是一团糟。
    • 我用过的每一种语言都一团糟,因为这是一组复杂的问题。
    • 责怪政客,而不是图书馆。
    猜你喜欢
    • 2020-07-08
    • 2010-12-31
    • 2023-03-18
    • 2013-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-03
    • 1970-01-01
    相关资源
    最近更新 更多