我有一个方法将字符串解析为日期,但我想验证我不会尝试解析非数字字符串或代表日期或时间格式的字符串?
我怎样才能做到这一点?
目前我有:
if(string=~ /^\D*$/ )
{
return false
else
do something_else
}
Run Code Online (Sandbox Code Playgroud)
这对于非数字字符串很好,"UNKNOWN"
但不适用"UNKNOWN1"
知道我可以用什么来确保只解析日期或时间格式?
Chr*_*ley 13
没有任何双关语,但此处的信息现已过时(2015年),并且已从Ruby 2.x中删除了一些方法和模块我将其留在此处以防万一有人,某处仍在使用1.8.7
好吧,也许那里有一个小双关语;-)
您可能会认为可以使用Date.parse或DateTime.parse来检查错误的日期(有关Date.parse的更多信息,请参阅此处)
d = Date.parse(string) rescue nil
if d
do_something
else
return false
end
Run Code Online (Sandbox Code Playgroud)
因为坏值会抛出一个可以捕获的异常.但是,建议的测试字符串实际上返回Date with Date.parse
例如 ..
~\> irb
>> Date.parse '12-UNKN/34/OWN1'
=> #<Date: 4910841/2,0,2299161>
>>
Run Code Online (Sandbox Code Playgroud)
Date.parse只是不够聪明地完成这项工作:-(
ParseDate.parsedate做得更好.您可以看到它尝试解析日期,但在测试示例中,找不到有效的年份或月份.更多信息在这里
>> require 'parsedate'
=> true
>> ParseDate.parsedate '2010-09-09'
=> [2010, 9, 9, nil, nil, nil, nil, nil]
>> ParseDate.parsedate 'dsadasd'
=> [nil, nil, nil, nil, nil, nil, nil, nil]
>> ParseDate.parsedate '12-UNKN/34/OWN1'
=> [nil, nil, 12, nil, nil, nil, nil, nil]
>> ParseDate.parsedate '12-UNKN/34/OWN1'
=> [nil, nil, 12, nil, nil, nil, nil, nil]
Run Code Online (Sandbox Code Playgroud)