gpt4 book ai didi

ruby-on-rails - Rails Date#strptime 在 200 年之前错误地解析日期

转载 作者:数据小太阳 更新时间:2023-10-29 07:31:34 24 4
gpt4 key购买 nike

为什么 Rails 的 Date#strptime 将“13/08”解析为 200 年之前的 8 月 15 日或 8 月 14 日?

Date.strptime('13/08/99', '%d/%m/%Y')  #=> Thu, 15 Aug 0099
Date.strptime('13/08/100', '%d/%m/%Y') #=> Fri, 14 Aug 0100
Date.strptime('13/08/199', '%d/%m/%Y') #=> Tue, 14 Aug 0199
Date.strptime('13/08/200', '%d/%m/%Y') #=> Wed, 13 Aug 0200

最佳答案

总结:

如果您不使用 timecop gem,Date#strptime 似乎适用于 < 200 年。

如果您使用 timecop,Date#strptime 会被覆盖并使用 Time#to_date,这似乎会返回错误的年份 < 200 值。

简单的解决方案,要么:

  • 不要使用时间警察
  • 如果你使用 Date#strptime_without_mock_date时间警察
  • 使用 Date.new + Time#strptime

更难的解决方案:了解 Time#to_date 的实现有什么问题(参见 Stefan 的解释。)

[0] pry(main)> Time.local(99,8,13).to_date
=> #<Date: 0099-08-15 ((1757444j,0s,0n),+0s,2299161j)>
[1] pry(main)> Date.strptime('13/08/99', '%d/%m/%Y')
=> #<Date: 0099-08-13 ((1757442j,0s,0n),+0s,2299161j)>
[2] pry(main)> require 'timecop'
=> true
[3] pry(main)> Date.strptime('13/08/99', '%d/%m/%Y')
=> #<Date: 0099-08-15 ((1757444j,0s,0n),+0s,2299161j)>
[4] pry(main)> Date.strptime_without_mock_date('13/08/99', '%d/%m/%Y')
=> #<Date: 0099-08-13 ((1757442j,0s,0n),+0s,2299161j)>
[5] pry(main)> time = Time.strptime('13/08/99', '%d/%m/%Y')
=> 0099-08-13 00:00:00 +0053
[6] pry(main)> Date.new(time.year,time.month,time.day)
=> #<Date: 0099-08-13 ((1757442j,0s,0n),+0s,2299161j)>

关于ruby-on-rails - Rails Date#strptime 在 200 年之前错误地解析日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40582289/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com