Ruby中的日期验证

时间:2016-07-20 04:51:47

标签: ruby-on-rails ruby date

如何检查日期是否为ruby中的有效日期。许多方法只检查范围。但是,我需要检查日期 一周检查日期是否有效。对于Ex:

    20 Jul 2016 Wed --> Valid
    20 Jul 2016 Mon --> Not-Valid

如何在ruby中执行此操作?

3 个答案:

答案 0 :(得分:1)

我不是假装有史以来最好的解决方案,但这应该有用。

def valid_date?(date)
  Date.parse(date).strftime("%d %b %Y %a") == date
end

[55] pry(main)> valid_date?("20 Jul 2016 Wed")
=> true
[56] pry(main)> valid_date?("20 Jul 2016 Mon")
=> false
[57] pry(main)>

如果您有多种格式,可以将格式作为第二个参数传递

def valid_date?(date, fmt)
  Date.parse(date).strftime(fmt) == date
end

=> :valid_date?
[59] pry(main)> valid_date?("20 Jul 2016 Wed", "%d %b %Y %a")
=> true

希望这会有所帮助。

<强>更新

正如我在评论中提到的,方法名称与现有方法valid_date?

重叠

因此,您可以重命名自定义方法

def date_valid?(date, fmt)
  Date.parse(date).strftime(fmt) == date
end

[2] pry(main)> date_valid?("20 Jul 2016 Wed", "%d %b %Y %a")
=> true

答案 1 :(得分:1)

出于好奇:

dates = ['20 Jul 2016 Wed', '20 Jul 2016 Mon']
dates.map do |date|
  Date.parse(date).public_send(
    Date.instance_methods.detect do |m|
      m.to_s =~ /\A#{date[-3..-1].downcase}.*day\?\z/
    end)
end
#⇒ [ true, false ]

答案 2 :(得分:1)

require 'date'

dates = ['20 Jul 2016 Wed', '20 Jul 2016 Mon']

dates.select do |s|
  d = Date.strptime(s[0,11], "%d %b %Y") rescue nil
  d.nil? ? false : (Date::ABBR_DAYNAMES[d.wday] == s[-3,3])
end
  #=> ["20 Jul 2016 Wed"]

这将读取“选择表示有效日期的字符串'dd mmm yyyy',其星期几与字符串的最后三个字符所给出的星期几相匹配”。