【问题标题】:PST/PDT in DateTime.parse in RubyRuby 中 DateTime.parse 中的 PST/PDT
【发布时间】:2017-01-06 12:48:50
【问题描述】:

我希望能够解析可能在 PST 或 PDT 中的日期字符串 根据夏令时。这意味着半年的日期将 是 PST,另一半日期是 PDT。

这是我现在的代码:

DateTime.parse('2016-02-21 10:00:02 PST/PDT')

这只会将日期解析为 PST (GMT-8)。

如何自动解析 PST/PDT 中的日期+时间?

谢谢!

【问题讨论】:

    标签: ruby parsing datetime timezone


    【解决方案1】:

    请注意:

    DateTime.parse('2016-02-21 10:00:02 PST/PDT') 将始终解析为 PST(标准时间),就像 DateTime.parse('2016-02-21 10:00:02 PDT') 将始终解析为 PDT(夏令时)。这是因为 DateTime 和 Time 库期望时区是明确的,而不是说“我可能是 x 或 y”的“PST/PDT”。如果它更聪明,它可以计算出这两个都在同一个区域,并且它们是夏令时等价物,但遗憾的是目前还没有。

    几个选项: 1) 使用时区 gem 将时间转换为本地区域 2) 根据年份手动放入 PST 或 PDT

    我倾向于以 UTC 格式存储所有日期/时间,并根据需要进行翻译。

    我使用TZInfo gem 根据当地时间显示/计算。它使用来自here的时区

    recorded_time = Time.now.getutc
    
    tz = TZInfo::Timezone.get('US/Pacific')
    local_created_at = tz.utc_to_local(recorded_time)
    

    现在,如果您已经将数据存储在 DateTime 中,或者如果您的入站数据已经以这种方式标记,这将无法解决您的问题。如果是,我建议您根据日期解析它。您可以使用此数据创建查找表:http://www.timeanddate.com/time/zone/usa/los-angeles

    编辑:刚刚意识到 TZinfo 能够为您解决这个问题:

    tz = TZInfo::Timezone.get('US/Pacific')
    => #<TZInfo::DataTimezone: US/Pacific>
    
    tz.local_to_utc(Time.parse('2016-07-21 10:00:02 PST/PDT')) 
    => 2016-07-21 17:00:02 UTC
    
    tz.local_to_utc(Time.parse('2016-02-21 10:00:02 PST/PDT'))
    => 2016-02-21 18:00:02 UTC
    

    【讨论】:

      猜你喜欢
      • 2016-01-04
      • 1970-01-01
      • 2016-11-10
      • 1970-01-01
      • 2022-01-09
      • 2014-02-14
      • 2020-03-08
      • 2014-04-24
      • 2012-05-22
      相关资源
      最近更新 更多