【发布时间】:2020-04-09 16:24:40
【问题描述】:
我正在使用Regex 来验证日期格式(YYYY-MM-DD) 使用这个 gem(https://github.com/nicolasblanco/rails_param)
param! :start_date, Date, format: /([12]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01]))/, required: true, message: "Query start_date is not specified and invalid"
对于正确的日期格式,它也说错误 查询 start_date 未指定
示例查询 http://localhost:3005/data?start_date=2008-01-27&end_date=2009-01-27
没有用
【问题讨论】:
-
另请注意,此验证即使具有正确的年份语法,也无法确保日期正确。您仍然可以收到
2019-02-31,这不是一个存在但根据正则表达式有效的日期。仅使用正则表达式进行正确的日期验证非常复杂,您最好只检查广泛的一致性,然后使用日期库进行实际验证。 -
@Stefan 是的,我刚刚注意到那里的
\d。我在你发帖前一秒删除了评论。 -
为什么要验证日期的字符串格式?为什么不只解析它(无论如何你都这样做),如果解析器没有引发错误,那么接受它是正确的,如果解析器引发错误,那么你返回有用的错误消息?
-
当且仅当
DateTime.strptime(input, '%Y-%m-%d')不引发异常时,该字符串才表示有效日期。因此,您需要在begin-rescue-end子句中执行它(在'require 'date'之后),并在抛出异常时捕获异常。对于要使用的正则表达式,它必须很复杂,部分原因是它必须实现确定一年是否为闰年的所有规则(例如,如果年份被 100 整除,则不是闰年,但不是 400)。不用说,正则表达式不是适合这里工作的工具。 -
虽然我建议使用DateTime::strptime,但我谨慎使用Date#parse,这是出了名的不可靠。例如,如果
parse的参数(一个字符串)包含单词“may”或“march”(甚至是一个以“may”或“march”开头的单词,例如“marching”和“maybe”) ,它会尽职尽责地将字符串变成日期。
标签: ruby-on-rails regex ruby