Ruby中的DateTime.parse中的PST / PDT

时间:2016-08-30 09:42:47

标签: ruby parsing datetime timezone

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

这是我现在的代码:

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

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

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

谢谢!

1 个答案:

答案 0 :(得分:3)

请注意:

DateTime.parse(' 2016-02-21 10:00:02 PST / PDT')将始终解析为PST(标准时间),就像DateTime.parse一样(' 2016- 02-21 10:00:02 PDT')将始终解析为PDT(白天时间)。这是因为DateTime&时间库期望时区是明确的,而不是PST / PDT'这是说'我可能是x或y'。如果它更聪明,它可以解决这两个在同一区域和它们是夏令时等价物,但遗憾的是不是在这一刻。

一些选择: 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