ruby-on-rails Ruby“strptime()”在传递无效的日期格式时不引发ArgumentError“

pcww981p  于 2023-01-27  发布在  Ruby
关注(0)|答案(2)|浏览(111)

我在Rails项目中遇到了一个问题,我需要一些帮助。我使用strptime函数从输入的字符串时间和目标格式返回一个Date对象:

date = Date.strptime(date, '%Y-%m')

当我传入一个不符合该模式的Date(例如01-01-24)时,它似乎不会抛出ArgumentError让我捕捉和处理任何事情,它确实捕捉了一个无效输入,如下所示:01-2024。我可以在这里做某种验证来捕捉这种错误并检查RegEx模式是否匹配吗?

oxiaedzo

oxiaedzo1#

Date#strptime使用'%Y-%m'作为[year]-[month],因此在'01-01-2024'的情况下,它被视为[01]-[01]-2024并被解析为该日期结构。
strptime不考虑%Y的最小宽度,因此当前表达式基本上等效于/\A-?\d+-(?:1[0-2]|0?[1-9])/(任意位数,后跟连字符,后跟1-12,可选填充0)
'01-2024'只会引发错误,因为20不是有效的月份。例如:'01-1299'不会引发错误。
您可以使用Regexp来验证您的“日期模式”,而不是依赖于这种天真。

date.match?(/\A\d{4}-(?:1[0-2]|0[1-9])\z/)
v2g6jxz6

v2g6jxz62#

用撬来调查:

[22] pry(main)> date = Date.strptime('calimero', '%Y-%m')
Date::Error: invalid date
from (pry):20:in `strptime'

它会抛出Date::Error异常

相关问题