在Ruby中,12个月!= 1.1年

War*_*ren 11 ruby ruby-on-rails date-math

Ruby的日期/时间助手很有用但我发现了一个差异.似乎12个月不等于1年.检查1.月,你会发现它等于30.days,当然,12*30.days = 360.days,比实际年份的长度短5.25天.

当我根据客户指定的授权月数设置访问我们网站的某些组件时,我遇到了这种情况.我发现在运行我的测试时,一个36个月的术语提前几周到期了.解决方案是这样的:

def months_to_seconds(number_of_months)
  ( (number_of_months.to_f / 12) * 1.year).to_i.seconds
end
Run Code Online (Sandbox Code Playgroud)

这将返回number_of_months表示的一年中任何部分的秒数.

由于1年是等于几秒到365.25天,为什么你认为他们没有1.month返回一年的1/12而不是30天的秒?

以前有人碰过这个吗?有没有人有更好的解决方案?

tad*_*man 24

一般来说,日历和时间是如此随意,并且充满了这样的不一致.没有标准长度的"月",因为变化在28到31天之间,正如没有标准长度的"日",可以是23到25小时,甚至分钟可以有任何地方考虑"闰秒"时59到62秒.同样,一年可以是365或366天,甚至是1582年的情况.

除非您正在对特定时间间隔进行计算,例如2010年1月3日到2011年10月19日之间的秒数,否则您将无法知道时间间隔使用抽象月,日或年的时间.这些因素取决于很多因素.

您的解决方案适合您的应用程序,但在Rails术语中,为简单起见,"月"仅为30天,就像"白天"是24小时一样.

  • + 1为此.在为我们的应用程序编写一些逻辑时,我们遇到了与OP类似的问题.基本上你必须意识到那些单位的时间不幸由于它们的性质而不排队,所以如果你每周,每月计算或其他东西进行转换,你只需要接受的事情就是近似并使用一致的转换方法(例如,总是先转换为天数) (3认同)

Mla*_*vić 9

是和否:

12 months1 year将它们用作相对间隔时相同,因为它们不会转换为秒,然后:

t = Time.now
#=> 2010-11-12 22:34:57 0100
t - 1.year == t - 12.months
#=> true
Run Code Online (Sandbox Code Playgroud)

在内部,这些间隔保存为年,月和日的数组,所以如果你说,例如:

1.year - 12.months
#=> 1 year and -12 months
Run Code Online (Sandbox Code Playgroud)

这意味着减法导致的间隔由"一年零下12个月"组成.

但是,如果to_i他们,他们需要转换为精确的秒数,并且有人认为"一个月"意味着"30天",这与任何其他人一样好,而你坚持下去.

这在文档中指出:

虽然这些方法在上述示例中使用时提供了精确的计算,但应注意,如果在使用前转换"月","年"等的结果,则不是这样.

我想这些间隔可以在某种程度上被视为"懒惰评估".