Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/61.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/6/cplusplus/162.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 on rails 在Ruby中,12.5个月!=一年半_Ruby On Rails_Ruby_Date Math - Fatal编程技术网

Ruby on rails 在Ruby中,12.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

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.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分钟。去死那些铯原子,比光速还快。