新手问题 求助各位大神。

Nekor · 2018年07月06日 · 最后由 victor 回复于 2018年07月16日 · 1561 次阅读

我现在想判断一个字符串是否为合法日期。 例如:

"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
dontyang 回复

不建议使用 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.strptime

Date.parse

这两个方法了解一下

gaotongfei 回复

事实上我想判断一个串是否是合法日期,但是如果这样

Date.parse("aasd-02-03").strftime("%Y-%m-%d")

像这样也是给判断成合法日期的。

breeze 回复

无法通用的判断这两种格式

"2014-08-20"
"2014/08/20"

/(^(\d{4})[-\/]{1}(\d{1,2})[-\/]{1}(\d{1,2})$)/ 简单粗暴,只能判断格式是否正确

aoner 回复

对。这样无法判断日期是否合法

@Nekor 格式合法在执行 to_date 嘛

2.5.1 :009 > "2018-02-30".to_date
Traceback (most recent call last):
        1: from (irb):9
ArgumentError (invalid date)
aoner 回复

感谢!

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
需要 登录 后方可回复, 如果你还没有账号请 注册新账号