【问题标题】:How to parse date and time in custom format according to correct time zone [duplicate]如何根据正确的时区以自定义格式解析日期和时间[重复]
【发布时间】:2016-09-15 09:09:54
【问题描述】:
> 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

而我想得到2015-12-31 23:59:00 -0500

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

如何解析Time.zone中自定义格式的给定输入?

【问题讨论】:

    标签: ruby timezone


    【解决方案1】:

    一种解决方案是将解析的时间转换为 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
    

    这两种解决方案看起来都很老套,我希望有更优雅的解决方案。

    【讨论】:

      猜你喜欢
      • 2019-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多