Ruby on rails 在Ruby中,12.5个月!=一年半
Ruby的日期/时间助手很有用,但我发现了一个差异。12个月似乎不等于1年。勾选1.1个月,你会发现它等于30.5天,当然,12*30.days=360.days,比实际年份短5.25天 当我根据客户指定的授权月数设置对网站某些组件的访问权限时,我遇到了这个问题。我在进行测试时发现,一个36.5个月的期限提前几周到期。解决方案是这样的:Ruby on rails 在Ruby中,12.5个月!=一年半,ruby-on-rails,ruby,date-math,Ruby On Rails,Ruby,Date Math,Ruby的日期/时间助手很有用,但我发现了一个差异。12个月似乎不等于1年。勾选1.1个月,你会发现它等于30.5天,当然,12*30.days=360.days,比实际年份短5.25天 当我根据客户指定的授权月数设置对网站某些组件的访问权限时,我遇到了这个问题。我在进行测试时发现,一个36.5个月的期限提前几周到期。解决方案是这样的: def months_to_seconds(number_of_months) ( (number_of_months.to_f / 12) * 1.yea
def months_to_seconds(number_of_months)
( (number_of_months.to_f / 12) * 1.year).to_i.seconds
end
它返回一年中以月数表示的任何分数的秒数
既然1.1年的秒数等于365.25天,为什么你认为他们没有1.1个月的时间来返回1/12年的秒数,而不是30天
以前有人见过这个吗?有谁有更好的解决办法吗?日历和时间通常都是任意的,充满了这样的矛盾。没有“月”的标准长度,因为变化范围在28至31天之间,正如没有“日”的标准长度,可以是23至25小时,如果考虑到“闰秒”,即使是分钟也可以是59至62秒。同样,一年可以是365天或366天,甚至是1582年的351天 除非您针对特定的时间间隔(如2010年1月3日至2011年10月19日之间的秒数)进行计算,否则您将无法使用抽象的月、日或年来知道时间间隔的长度。这些事情取决于许多因素
您的解决方案适合您的应用程序,但为了简单起见,Rails术语中的“月”仅为30天,就像“日”是24小时一样。1年由12个单独的月组成,但其中几个月的大小不同。考虑到一个月实际上可能是28、29、30或31个日历日,我们有理由期望任何给定的月长定义都可能不是我们想要的 就我个人而言,在大多数情况下,我用4周来定义一个月。在本例中,如果您授予“一个月”的访问权限,我倾向于存储授予访问权限的当月的日期。然后,取月号,并将到期日期放在N个月号之后的同一天
require 'date'
expire_date = Date.today >> 36
puts expire_date #=> 2013-11-12
如果要减去月份,请使用是和否:
12个月
与1年
用作相对间隔时相同,因为它们不会转换为秒:
t = Time.now
#=> 2010-11-12 22:34:57 0100
t - 1.year == t - 12.months
#=> true
在内部,这些间隔被保存为年、月和日数的数组,因此如果您说,例如:
1.year - 12.months
#=> 1 year and -12 months
这意味着减法的结果是“一年减去12个月”
但是如果你对它们进行,它们需要被转换成精确的秒数,有人认为“一个月”意味着“30天”,这和其他任何时间一样,是一个很好的近似值
文件中指出:
而这些方法提供了精确的
在中使用时的计算
在上面的例子中,应小心
请注意,如果
“月”、“年”等的结果为
使用前已转换
我想这些时间间隔在某种程度上可以被视为“惰性评估”。不相关,但你不需要来调用它;只需除以12.0
。换句话说,不要将月份的/length/用于任何事情;使用本月的数字。+1表示此。在为我们的应用程序编写一些逻辑代码时,我们遇到了与OP类似的问题。基本上,你必须意识到,不幸的是,由于时间单位的性质,这些时间单位并不一致,因此,如果你在每周、每月或其他时间进行换算,你只需接受近似值,并使用一致的换算方法(例如,始终先换算为天数)令人难过的是,一秒钟甚至还不到1/60分钟。去死那些铯原子,比光速还快。