为什么具有特定格式的日期字符串被具有显式不同格式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
我想你有两个隐藏的问题。
为什么
01
是%Y
的有效匹配(意思是"包括世纪在内的年份"(
因为为什么要假设 4 位数的年份?否则,您将无法指定 3 位数的年份(例如,基辅成为罗斯首都的 882 年(。或者也许在这种情况下,你的意思是第 1 年。露比不知道。
为什么
1970
是%d
的对手?
因为这就是strptime(3)
的工作方式(它应该与之兼容(。一旦格式描述符%d
("day, 1-31"(满足19
,字符串就停止处理。
函数的返回值是指向此函数调用中未处理的第一个字符的指针。如果输入字符串包含的字符数超过格式字符串所需的字符数,则返回值将紧跟在最后一个使用的输入字符之后。