【问题标题】:Ruby 1.87 vs 1.92 Date.parseRuby 1.87 与 1.92 Date.parse
【发布时间】:2011-03-20 23:49:53
【问题描述】:

在 Ruby 1.87 中我可以这样做:

Date.parse ("3/21/2011")

现在在 1.9.2 中我得到:

ArgumentError: 无效日期

有什么想法吗?

【问题讨论】:

  • @bensiu,docs 不能帮助解释问题或提供解决方法。

标签: ruby-on-rails ruby


【解决方案1】:

使用strptime 并给出具体的时间格式。

ruby-1.9.2-p136 :022 > Date.strptime '03/21/2011', '%m/%d/%Y'
 => #<Date: 2011-03-21 (4911283/2,0,2299161)>

请参阅michaelmichael's response,了解 Ruby 版本之间存在这种差异的原因。

【讨论】:

  • 只是古玩,但您将如何为 ruby​​ 设置语言环境?
  • 看起来你可以使用 ActiveSupport 的日期扩展:thedevelopercorner.blogspot.com/2009/03/…
  • 通过查看 Date 的 date/format.rb/_parse 方法,我没有看到任何检查语言环境信息的内容。该代码采用非美国格式并首先检查它,然后是美国。超出范围的月份值 (13-31) 会触发问题。最好的解决方案是知道日期来自哪个区域,然后以编程方式决定是在Date#strptime 中使用%m/%d/%y 还是%d/%m/%y 格式。
  • "你将如何为 ruby​​ 设置语言环境?",你不是专门为 Ruby 做的。这是一个系统范围的设置。在 Mac OS X 或 Linux 上,在命令行中使用 man locale 以获取更多信息。我不记得如何为 Windows 设置它,但它可以设置。
【解决方案2】:

根据this bug report,解析mm/dd/yy 日期的功能在1.9 中被有意删除。 Ruby 的创造者 Yukihiro Matsumoto 说:

“dd/dd/dd”格式本身就很 文化依赖和模棱两可。它 在日本是 yy/mm/dd(和其他 国家),mm/dd/yy 在美国,dd/mm/yy 在欧洲国家,对吧?在一些 案例,你可以偶然告诉他们, 但我们不应该依赖运气 一般情况。我相信那是 解析此格式的原因被禁用 在 1.9 中。

正如 hansengel 建议的那样,您可以改用 Date.strptime

【讨论】:

  • 有趣。那么为什么Date.parse('1/1/2001') 在Ruby 1.9.2-p180 中工作,并且出现在date.rb 源代码中呢? Date.parse('1/1/2001') #=&gt; #&lt;Date: 2001-01-01 (4903821/2,0,2299161)&gt;, RUBY_VERSION #=&gt; "1.9.2" Date.parse
  • @the Tin Man,将第一个 1 解析为日期,将第二个 1 解析为月份(dd/mm/yy 格式)。您只是无法分辨,因为它们是相同的数字;)
  • @michaelmichael,感谢您找到真正的原因。我更新了我的答案以参考您的答案,以便接受的答案一切正确。
  • @Hans Engel,Date#parse 仍然可用,并且适用于所有格式,尽管上面的答案中有链接注释。问题是当日期值与月份混淆时。 Ruby 不能很好地处理这个问题,并且不会检查操作系统来自动解析正确的格式。我们必须这样做。 Date.parse 方法不是正确的工具,但如果需要,它仍然可用。
  • @the Tin Man I didn't say Date#parse 仍然不可用。也许我在上面的帖子中误读了 Matz 的回复。如果不能使用Date#parse 来解析 mm/dd/yy 日期,他说的什么被删除了?
【解决方案3】:

我一直难以用Date.parse 解析日期。我的解决方案是感谢chronic gem。我也喜欢另一个答案中的strptime 函数。

【讨论】:

    【解决方案4】:

    我喜欢 american_date gem 来完成这个...

    【讨论】:

    • 为什么这个解决方案感觉这么脏?我尝试修改我的代码以使用 Time.strptime(...),但遇到了 JQuery datepicker 和 PostgreSQL 数据库格式的级联问题。浪费了几个小时。但是这颗宝石完美地工作......只是感觉很老套和肮脏......期待这个问题在未来再次出现!
    • @vanboom 是的,这有点奇怪,但是那个 gem 的作者是 Ruby 日期的权威,所以如果他写了一个 gem,这显然是必要的。
    【解决方案5】:
      class << self
        def parse_with_us_format(date, *args)
          if date =~ %r{^\d+/\d+/(\d+)$}
            Date.strptime date, "%m/%d/#{$1.length == 4 || args.first == false ? '%Y' : '%y'}"
          else
            parse_without_us_format(date, *args)
          end
        end
        alias_method_chain :parse, :us_format
      end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-19
      • 2014-12-04
      • 1970-01-01
      • 2012-07-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多