【发布时间】: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
我希望能够解析可能在 PST 或 PDT 中的日期字符串 根据夏令时。这意味着半年的日期将 是 PST,另一半日期是 PDT。
这是我现在的代码:
DateTime.parse('2016-02-21 10:00:02 PST/PDT')
这只会将日期解析为 PST (GMT-8)。
如何自动解析 PST/PDT 中的日期+时间?
谢谢!
【问题讨论】:
标签: ruby parsing datetime timezone
请注意:
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
【讨论】: