为什么具有明确格式的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
Run Code Online (Sandbox Code Playgroud)
期望:测试通过
it 'raises an exception when wrong format' do
expect { Date.strptime('01-01-1970', '%Y-%m-%d') }.to raise_exception(ArgumentError, 'invalid format')
end
Run Code Online (Sandbox Code Playgroud)
实际: expected ArgumentError with "invalid format" but nothing was raised
我想您有两个隐藏的问题。
为什么要
01进行有效匹配%Y(意味着“年份包括世纪”)
因为为什么假设4位数字的年?否则,您将无法指定3位数的年份(例如,882年是基辅成为罗斯的首都)。或者,也许在这种情况下,你做了平均每年1 Ruby没有想法。
为什么要
1970匹配%d?
因为那是strptime(3)工作方式(应该与之兼容)。一旦满足格式描述符%d(“ day,1-31”)19,该字符串就会停止处理。
该函数的返回值是指向此函数调用中未处理的第一个字符的指针。如果输入字符串包含的字符超过了格式字符串所需的字符,则返回值将指向最后使用的输入字符之后。