如何根据正确的时区以自定义格式分析日期和时间

时间:2016-09-15 09:09:54

标签: ruby timezone

Array
(
    [0] => Array
        (
            [user_id] => 57d67290823fb647dd174739
        )

    [1] => Array
        (
            [user_id] => 57d672cb823fb647dd17473a
        )

    [2] => Array
        (
            [user_id] => 57d67549d81e1845e4dba983
        )
)

我希望获得> input = "12/31/2015 23:59" > format = "%m/%d/%Y %H:%M" > Time.zone = "US/Eastern" > Time.zone.utc_offset => -18000 > Time.strptime(input, format) => 2015-12-31 23:59:00 +0100 > DateTime.strptime(input, format) => Thu, 31 Dec 2015 23:59:00 +0000

正如您所看到的,strptime的两个版本都忽略了配置的时区(一个使用UTC,一个使用系统/机器时区)。

如何在2015-12-31 23:59:00 -0500中自定义格式解析给定输入?

1 个答案:

答案 0 :(得分:0)

一种解决方案是将解析时间转换为ISO字符串,删除不正确的时区信息并再次解析,这次使用Time.zone.parse使用Time.zone:

> parsed = Time.strptime(input, "%m/%d/%Y %H:%M")
> Time.zone.parse(parsed.to_s.gsub(/\+\d\d:?\d\d/, ""))
=> 2015-12-31 23:59:00 -0500

一种解决方案是将解析时间转换为ISO字符串,删除不正确的时区信息并再次解析,这次使用Time.zone.parse使用Time.zone:

> parsed = Time.strptime(input, "%m/%d/%Y %H:%M")
> Time.zone.parse(parsed.to_s.gsub(/\+\d\d:?\d\d/, ""))
=> 2015-12-31 23:59:00 -0500

还可以将时区附加到输入(和格式):

> DateTime.strptime(input + Time.zone.name, format + " %Z")
=> Thu, 31 Dec 2015 23:59:00 -0500

这两种解决方案看起来都像是一种hackish,我希望更优雅。

相关问题