我现在想判断一个字符串是否为合法日期。 例如:
"2014-08-20"
或
"2014/08/20"
使用正则表达式的话,是无法准确判断各个月份的天数,大月或者小月。
to_date 捕捉异常简单粗暴。
[1] pry(main)> "1".to_date
ArgumentError: invalid date
from /Users/xor3/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/activesupport-5.1.5/lib/active_support/core_ext/string/conversions.rb:45:in `parse'
[2] pry(main)> "2014-08-20".to_date
=> Wed, 20 Aug 2014
[3] pry(main)> "2014/08/20".to_date
=> Wed, 20 Aug 2014
不建议使用 to_date,原因:
2.3.1 :004 > '100'.to_date
=> Tue, 10 Apr 2018
2.3.1 :005 > '200'.to_date
=> Thu, 19 Jul 2018
可转为三位数字的字符串会被转换为本年的第 n 天的日期;
可转为两位数字的字符串会被转换为本月的第 n 天的日期。
比如'10'.to_date => Tue, 10 Jul 2018 # 本月第 10 天
'100'.to_date => Tue, 10 Apr 2018 # 本年第 100 天的日期
'32'.to_date => ArgumentError: invalid date
'368'.to_date => ArgumentError: invalid date
所以还是用 Date.strptime 比较好。
事实上我想判断一个串是否是合法日期,但是如果这样
Date.parse("aasd-02-03").strftime("%Y-%m-%d")
像这样也是给判断成合法日期的。
@Nekor 格式合法在执行 to_date 嘛
2.5.1 :009 > "2018-02-30".to_date
Traceback (most recent call last):
1: from (irb):9
ArgumentError (invalid date)
require 'date'
def valid_date?(text)
args = text.split(/[\/|-]/)
Date.valid_date? *args.map(&:to_i)
end
p valid_date? "2014-08-a0" #=> false
p valid_date? "2014-08-10" #=> true