【发布时间】:2019-10-29 10:17:37
【问题描述】:
为什么 strptime 方法成功解析了特定格式的日期字符串?
需要为 API 明确接受格式日期
$ ruby -v
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-linux]
$ irb
irb(main):001:0> require 'date'
=> true
irb(main):002:0> Date.strptime('01-01-1970', '%Y-%m-%d')
=> #<Date: 0001-01-19 ((1721442j,0s,0n),+0s,2299161j)>
irb(main):003:0> Date.strptime('01-01-1970', '%Y-%m-%d').to_s
=> "0001-01-19"
irb(main):004:0> Date.strptime('01-01-1970', '%Y-%m-%d').year
=> 1
irb(main):005:0> Date.strptime('01-01-1970', '%Y-%m-%d').day
=> 19
期望:测试通过
it 'raises an exception when wrong format' do
expect { Date.strptime('01-01-1970', '%Y-%m-%d') }.to raise_exception(ArgumentError, 'invalid format')
end
实际:expected ArgumentError with "invalid format" but nothing was raised
【问题讨论】:
-
因为 Ruby 解析日期的方式是完全有效的,你可以通过在 repl 中运行它来展示自己。
-
@DaveNewton 你看到格式了吗?
'%Y-%m-%d'perfectly valid是什么,1970天? -
@maxpleaner 你读过吗?问题是:
why it's happened?,而不是:how to parse string date? -
@AlexeyStrizhak 我确实做到了。是的,因为它解析日期的方式,正如 Sergio 详细解释的那样,它将解析为有效日期。您需要使用正则表达式或更严格的日期解析机制。