Ruby on rails Ruby将十进制持续时间(日|周|月|年)转换为结束日期

Ruby on rails Ruby将十进制持续时间(日|周|月|年)转换为结束日期,ruby-on-rails,ruby,Ruby On Rails,Ruby,我有一个起始点,一个十进制的数量和一个间隔,它是天|周|月|年之一 start_at = Time.parse('2016-01-01 00:00:00 UTC') # leap year quantity = BigDecimal.new('1.998') # changed from 2.998, should end on 2/29/16 sometime interval = 'month' # could be any of day|week|month|year 对于整数,我使用了

我有一个
起始点
,一个十进制的
数量
和一个
间隔
,它是
天|周|月|年
之一

start_at = Time.parse('2016-01-01 00:00:00 UTC') # leap year
quantity = BigDecimal.new('1.998') # changed from 2.998, should end on 2/29/16 sometime
interval = 'month' # could be any of day|week|month|year
对于整数,我使用了duration,即
1.month
,并查看了
Date#advance
,尽管它只识别整数值

这看起来很简单,但我在标准库或ActiveSupport中找不到任何内容

参考资料:

问题

如何从一个小数点建立在日期的
end\u

为什么?什么目的?

对于给定数量和给定间隔,按比例分配到第二个

期望值


我正在寻找一个尽可能精确到秒的
end\u,以将下一个
间隔
(s)按十进制
数量
。给定
interval='month'
,对于小数部分,当您通过月初时,表示您在
该月并使用其持续时间。例如,2016年1月为31天,而2月(闰年)为29天(仅在闰年)

提前一个月意味着什么

假设我们有以下日期
2015-01-01 00:00:00 UTC
。很容易提前整整一个月,我们只需增加表示月份的数字:
2015-02-01 00:00:00 UTC
。或者,我们可以将其视为增加31天,我们知道这是1月份的天数

但是,如果我们想从UTC标准时间2015-01-01 00:00:00提前0.5个月怎么办

我们不能像提前一个月那样只增加一点。既然我们知道一月份有31天,也许我们可以提前15.5天:
2015-01-16 12:00:00 UTC
。这类工作

从协调世界时2015-01-01 00:00:00起1.5个月怎么样?如果我们结合前面的方法,我们将首先增加,使我们的前进距离为0.5,并
2015-02-01 00:00:00 UTC
。然后,我们将取28的一半,然后到达
2015-02-15 00:00:00 UTC

但是等等,如果我们取两个月之间的总天数,然后取其中的3/4呢?例如2(月)*(3/4),这将简化为(3(月))/2或1.5(月)。让我们试试看

(28 days + 31 days) * 0.75 = 44.25 days
现在将其添加到
2015-01-01 00:00:00 UTC
中,我们得到
2015-02-14 06:00:00 UTC
。这与我们的另一个答案相差四分之三天

这里的问题是,一个月的长度不同。因此,小数月份的定义并不一致

想象你有两个桔子。其中一种果汁比另一种多一点(可能是31毫升和29毫升果汁)。你的食谱需要1.5个橙汁。根据你决定减半的那一种,你可以有44.5毫升或45.5毫升。但是如果你的食谱要求40毫升的橙汁,你可以非常一致地测量。就像你可以持续地(某种程度上)增加一个日期40天


时间真的很棘手。我们有闰秒、闰年、不一致的单位(月)、时区、夏令时等等。。。考虑到。根据您的使用情况,您可以尝试近似使用小数月份,但我强烈建议您尽量避免使用小数月份。

我认为您最好的选择是使用Ruby的日期方法根据小数位数提前时间,然后计算你的分数占当前间隔的秒数


因此,对于1.998个月,提前时间为1个月。找到您所在的当前月份,并获取该月份秒数的.998(即7月的31x24x6060x.998),然后将时间提前到该秒数

你想把约会时间提前2.998个月吗?这根本没有道理。一个月的长短取决于手头的月份。所以,如果你把一个月作为一个固定的30天间隔,那么就根据这个假设,用30天的秒数来计算一切。@phoet-这正是为什么这不是直接的,否则你会做类似于
30.days.to_i*quantity
@WesFoster是的,我更新了这个问题。但请记住,这可能是2.998年、几天或几周。这是用于按比例复发。我感谢你描述问题的细节,这就是我问这个问题的原因。但事实并非如此:
这里的问题是一个月的长度不同。因此,小数月份是不可定义的。
它们是可定义的(地球自转时间调整除外),否则我们就不会有未来的日历。我已经用期望值更新了这个问题,在确定按比例分配的金额的
结束时,这不是可以避免的。任何给定的月份,例如
2015年1月
,都是可以一致定义的。我的全部观点是,
0.23个月
取决于你处理的是哪个月,这意味着就其本身而言,
0.23个月
是不一致的定义<但是,2015年2月的代码>0.23仍然有效。现在我知道了您的特定用例是什么,我认为我的原始答案中的这一点适用:
根据您的用例,您可以尝试使用小数月,但我强烈建议尽量避免处理零碎月份。
这是一种合理处理零碎月份的情况。
start\u at
始终是定义的(并且没有更改),因此未来是确定的。建议避免这个问题也许不是回答如此问题的最佳方式。