Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby “日期”中的Bug?它分析了一个月内超过30/31的天数,把它们和年份混淆了_Ruby_Date - Fatal编程技术网

Ruby “日期”中的Bug?它分析了一个月内超过30/31的天数,把它们和年份混淆了

Ruby “日期”中的Bug?它分析了一个月内超过30/31的天数,把它们和年份混淆了,ruby,date,Ruby,Date,为什么使用显式不同格式的strtime方法成功解析具有特定格式的日期字符串 需要明确接受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: 0

为什么使用显式不同格式的
strtime
方法成功解析具有特定格式的日期字符串

需要明确接受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


实际:
预期ArgumentError为“无效格式”,但未提出任何问题

我认为您有两个隐藏的问题

为什么
01
%Y
的有效匹配项(意思是“年包括世纪”)

因为为什么假设4位数的年份?否则,您将无法指定3位数的年份(例如,882年是基辅成为罗斯首都的时候)。或者在这种情况下,你指的是第一年。鲁比不知道

为什么
1970
%d
匹配

因为这就是工作原理(它应该与之兼容)。一旦格式描述符
%d
(“日期,1-31”)满足
19
,字符串将停止处理

函数的返回值是指向此函数调用中未处理的第一个字符的指针。如果输入字符串包含的字符数超过格式字符串所需的字符数,则返回值正好位于上次使用的输入字符之后


由于Ruby解析日期的方式,它是完全有效的,您可以通过在repl中运行它来显示自己。可能是@DaveNewton的副本您看到格式了吗<代码>'%Y-%m-%d'什么是
完全有效的
1970
天?@maxpleaner你读过吗?问题是:
为什么会这样?
,而不是:
如何解析字符串日期?
@AlexeyStrizhak我确实这么做了。是的,因为它解析日期的方式,正如Sergio详细解释的那样,它将解析为一个有效的日期。您需要使用正则表达式或更严格的日期解析机制。嗯。。。为什么
Ruby
会拆分字符串并按部分进行分析?我的意思是,如果我提供显式格式,那么我期望在这种格式的逻辑范围内进行解析,我不知道为什么它不应该在复杂的format@AlexeyStrizhak:可能您只是对格式说明符的作用或严格程度有错误的期望。如果必须拒绝问题中的日期字符串(因为不符合格式),请在将字符串解析为日期之前使用正则表达式检查该字符串。这实际上是一个你可以在编码面试中看到的问题(我确实看到了)。有道理。谢谢你|>错误的期望|是的,看起来是这样。老实说,我会重新阅读你的答案,尽量理解,谢谢!我不知道这种行为(re day),我想知道为什么Ruby僧侣会选择这样做。毕竟,如果我们允许
Date.strtime('28-03-2019','%Y-%m-%d')
为什么要假设日期是
“20”
字符串
“19”
,而不是日期
“2”
后跟字符串
“019”
?此外,如果这是格式字符串的意外反转,那么Ruby不引发异常会使编码人员更难跟踪错误。你或任何人能为这个语言设计决定提出一个理由吗?@CarySwoveland:我打赌与C stdlib兼容。我的意思是,如果我们正在复制
printf
及其格式字符串行为,为什么要在实现这一点时有所偏差?最不出人意料的原则。
it 'raises an exception when wrong format' do
 expect { Date.strptime('01-01-1970', '%Y-%m-%d') }.to raise_exception(ArgumentError, 'invalid format')
end