上帝搞乱日期操作

时间:2011-09-30 22:03:59

标签: ruby-on-rails ruby god

这是一个经过考虑的想法。按照我的步骤:

没有上帝,在控制台上:

> d=Date.parse("2010-02-01")
=> Mon, 01 Feb 2010
> d+1.day
=> Tue, 02 Feb 2010

完美。

然后,我转到我的Gemfile并添加

gem 'god'

并运行

bundle install

之后,再次在控制台上:

> d=Date.parse("2010-02-01")
=> Mon, 01 Feb 2010 
> d+1.day
=> Sun, 23 Aug 2246

你知道会发生什么吗?

3 个答案:

答案 0 :(得分:2)

奇怪,这是在控制台中发生的。我可以在其他场景中理解它,其中1.day被用作一个地方的输入并被提取用于其他地方,因为1.day是Fixnum 86400,其中包含一些特殊的元数据(#steps)进入它。

例如,

Date会将+ 1视为“添加一天”。 Rails添加了一些行为,以便它理解1.day事物(86400“秒”,但step[1, :days])实际上是+ 1而不是+ 86400 }。这就是你失败的原因:

ruby-1.9.2-p290 :171 > d = Date.parse("2010-02-01")
 => #<Date: 2010-02-01 (4910457/2,0,2299161)> 
ruby-1.9.2-p290 :172 > d + 86400
 => #<Date: 2246-08-23 (5083257/2,0,2299161)> 
ruby-1.9.2-p290 :173 > 

因此,值1.day被解释为Fixnum,而不是具有ActiveSupport::Duration的Fixnum。

irb(main):001:0> Date.parse("2010-02-01") + 1.day.to_i
=> Sun, 23 Aug 2246

因此,如果您在未立即使用的上下文中使用此1.day值,请不要......使用Fixnum 1;)

答案 1 :(得分:1)

“上帝”弄得一团糟。这是“上帝”的问题。与Rails一起使用的gem不应该改变Rails约定。如果Date.current - 4.days做了一件没有“上帝”的事情,那么它应该用“上帝”来做。周期。

答案 2 :(得分:0)

根据GitHub open issue,我尝试了这个解决方案:

的Gemfile

gem 'god', :require => false

而不是:

gem 'god'

一切似乎再次起作用:

1.9.3p0 :001 > d = Date.parse('2012-04-16')
 => Mon, 16 Apr 2012 
1.9.3p0 :002 > d + 1.day
 => Tue, 17 Apr 2012