Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 如何让strtime使用垃圾尾随字符引发ArgumentError_Ruby_Validation_Parsing_Date - Fatal编程技术网

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