Ruby 如何让strtime使用垃圾尾随字符引发ArgumentError
我们必须在应用程序中处理用户指定的日期格式。我们决定使用Ruby 如何让strtime使用垃圾尾随字符引发ArgumentError,ruby,validation,parsing,date,Ruby,Validation,Parsing,Date,我们必须在应用程序中处理用户指定的日期格式。我们决定使用Date.strtime进行解析和验证,这非常有效,只是它忽略了输入的任何垃圾数据。下面是一个irb会议,演示了这个问题 ree-1.8.7-2010.01 > require 'date' => true ree-1.8.7-2010.01 > d = Date.strptime '2001-01-01failfailfail', '%Y-%m-%d' => #<Date: 4903821/2,0,22
Date.strtime
进行解析和验证,这非常有效,只是它忽略了输入的任何垃圾数据。下面是一个irb会议,演示了这个问题
ree-1.8.7-2010.01 > require 'date'
=> true
ree-1.8.7-2010.01 > d = Date.strptime '2001-01-01failfailfail', '%Y-%m-%d'
=> #<Date: 4903821/2,0,2299161>
ree-1.8.7-2010.01 > d.to_s
=> "2001-01-01"
任何建议都将不胜感激一种可能性是使用相同的格式通过
strftime
传递结果日期,并与原始字符串进行比较
i、 e.valid=Date.strtime(日期字符串,格式)。strftime(格式)==Date\u字符串
这种方法的一个限制是,它不会处理部分日期中的前导0,例如,如果您希望接受2010-6-1,但strftime
返回2010-06-01,则您不会有匹配项
另外,我不确定这是否是您的意思,但您的第二个示例
Date.strtime'2001failfailfail-01-01','%Y-%m-%d'
确实引发了一个ArgumentError
。似乎只有后续垃圾被忽略。一种方法是定义一个新类,该类首先进行验证
require 'date'
class Mydate
def self.strptime(string)
raise ArgumentError 'Fail' if string !~ /^\d\d\d\d-\d\d-\d\d$/
Date.strptime(string)
end
end
d = Mydate.strptime '2001-01-01'
puts d
d2 = Mydate.strptime '2001-01-02xxxx'
puts d2
需要“日期”
类Mydate
def self.strtime(字符串)
如果字符串为,则引发ArgumentError“Fail”~/^\d\d\d\d-\d\d-\d\d$/
Date.strtime(字符串)
结束
结束
d=Mydate.strTime“2001-01-01”
放置d
d2=Mydate.strTime“2001-01-02xxxx”
放d2
另一种方法是打开Date类,别名为strtime方法,编写一个新的方法来执行所需的验证,然后调用别名方法
require 'date'
class Date
class << self
alias :orig_strptime :strptime
end
def self.strptime(string)
puts "in new strptime"
raise ArgumentError 'Fail' if string !~ /^\d\d\d\d-\d\d-\d\d$/
Date.orig_strptime(string)
end
end
d = Date.strptime '2001-01-01'
puts d
d2 = Date.strptime '2001-01-02xxxx'
puts d2
需要“日期”
上课日期
这真是个好主意。我所说的第二个区块是指我想要从第一个区块得到的行为 require 'date' class Date class << self alias :orig_strptime :strptime end def self.strptime(string) puts "in new strptime" raise ArgumentError 'Fail' if string !~ /^\d\d\d\d-\d\d-\d\d$/ Date.orig_strptime(string) end end d = Date.strptime '2001-01-01' puts d d2 = Date.strptime '2001-01-02xxxx' puts d2