ruby - 如何让 strptime 引发带有垃圾尾随字符的 ArgumentError

标签 ruby validation parsing date

我们必须在我们的应用程序中处理用户指定的日期格式。我们决定使用 Date.strptime 进行解析和验证,效果很好,除了它如何忽略输入的任何垃圾数据。这是演示该问题的 irb session

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" 

我们想要的是更像这样的行为

ree-1.8.7-2010.01 > d = Date.strptime '2001failfailfail-01-01', '%Y-%m-%d'
ArgumentError: invalid date

如有任何建议,我们将不胜感激

最佳答案

一种可能性是使用相同的格式通过 strftime 传递结果日期并与原始字符串进行比较。

valid = Date.strptime(date_string, format).strftime(format) == date_string

这样做的一个限制是它不会处理日期部分中的前导 0,例如如果您想接受 2010-6-1 但 strftime 返回 2010-06-01 则您将找不到匹配项。

此外,我不确定这是否是您的意思,但是您的第二个示例 Date.strptime '2001failfailfail-01-01', '%Y-%m-%d' 确实引发了一个 ArgumentError。似乎只有尾随的垃圾被忽略了。

关于ruby - 如何让 strptime 引发带有垃圾尾随字符的 ArgumentError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2968196/

相关文章:

ruby-on-rails - 基于 ruby​​ on Rails 中的另一个下拉菜单填充下拉菜单

Ruby - 系统命令 - ps aux

ruby-on-rails - 按年份和月份对 Rails 中的 ruby​​ 数组进行分组

Javascript 表单验证仍然重定向

c# - C#中的解析树

ruby-on-rails - 在 Rails 生成器中使用 template() 强制覆盖文件?

java - BindingResult 未检测到 JSR :303 annotation based errors

javascript - Joi - 默认设置所需的一切?

php - 用php解析javascript文件

c# - Enum.Parse 无法转换字符串