“日期#strtime”中的错误?它解析一个月内超过 30/31 的日子,将它们与年份混淆

  • 本文关键字:日子 一个 错误 日期 #strtime ruby date
  • 更新时间 :
  • 英文 :


为什么具有特定格式的日期字符串被具有显式不同格式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,字符串就停止处理。

函数的

返回值是指向此函数调用中未处理的第一个字符的指针。如果输入字符串包含的字符数超过格式字符串所需的字符数,则返回值将紧跟在最后一个使用的输入字符之后。

相关内容

最新更新