2015-07-10 73 views
1

我有一個start_at,小數quantityinterval這是一個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 

隨着整數,我使用時間,即1.month,我看着Date#advance,但它只能識別整數值。

這看起來很簡單,但我在標準庫或ActiveSupport中找不到任何東西。

參考文獻:

問題

我怎樣才能建立一個從十進制end_at日期?

爲什麼?目的是什麼?

對於給定數量的第二個推斷給定間隔。

期望

我正在尋找一個end_at到第二儘可能準確相對於前進下一interval(一個或多個)由十進制quantity。給定interval = 'month',對於小數部分,當您通過月份的開始時,表示您當月是in並使用它的持續時間。例如,2016年1月是31天,而2月(閏年)是29天(僅在閏年)。

+0

您是否試圖將日期時間提前2.998個月? –

+0

甚至沒有意義。一個月的時間長短取決於手頭的月份。因此,如果您將月份作爲固定的30天時間間隔,則只需使用30天內的秒數計算所有內容即可。 – phoet

+0

@phoet - 這就是爲什麼這不是直接的,否則你會做'30.days.to_i *數量'。 – kross

回答

2

我會說你最好的選擇是使用Ruby的日期方法來提前基於整數小數的時間,然後計算你的分數是多少秒你當前的時間間隔。

因此爲1.998個月,提前時間1個月。找到你當前的月份並獲得當月秒數的0.998(即7月份,31x24x60x60x.998),然後提前幾秒鐘。

1

推進時間的分數月是什麼意思?我們有以下日期2015-01-01 00:00:00 UTC。整整一個月很容易推進,我們只需遞增代表月份的數字:2015-02-01 00:00:00 UTC。或者,我們可以將其視爲增加31天,我們知道這是一月的天數。

但是如果我們想從2015-01-01 00:00:00 UTC前進0.5個月呢?

我們不能像我們在推進整整一個月時那樣增加。既然我們知道1月有31天,也許我們可以提前15.5天:2015-01-16 12:00:00 UTC。那種作品。

如何從2015-01-01 00:00:00 UTC 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。這是我們其他答案每天的四分之三。

這裏的問題是一個月的長度不一樣。所以分數月並不總是可以定義的。

想象一下,你有兩個桔子。其中一種比另一種含有更多的果汁(可能是31ml和29ml果汁)。你的食譜需要1.5個桔子汁。根據你決定哪一個減半,你可以有44.5毫升或45.5毫升。但是如果你的食譜需要40毫升橙汁,你可以持續衡量。就像你可以持續(某種)將日期遞增40天一樣。

時間真的很棘手。我們有閏秒,閏年,不一致的單位(月),時區,夏令時等,以考慮到。根據您的使用情況,您可以嘗試近似分數的月份,但我強烈建議儘量避免處理分數月的需要。

+0

我很欣賞你描述問題的細節,這是我問這個問題的原因。但這並不是真的:「這裏的問題是一個月的時間長短不一。因此,小數月不是一貫可定義的。「它們是可定義的(除了地球自轉時間調整),否則我們不會有未來的日曆。我已經用期望更新了這個問題,並且在確定按比例分配的數量的「end_at」時,這是不可避免的。 – kross

+0

任何給定的月份,例如'2015年1月'始終可以定義。我的整個觀點是'0.23個月'取決於你處理的月份,這意味着'0.23個月'並不總是可以定義的。然而,2015年2月的0.23。現在我知道你的特定用例是什麼了,我認爲這個我原來的答案適用於:'根據你的用例,你可以嘗試接近部分月份,但我強烈建議儘量避免處理小數月。「這是一個合理處理分數月的情況。 – Emily

+0

'start_at'總是被定義的(並且沒有改變),所以未來被定義。建議避免這個問題可能不是回答SO問題的最佳方式。 – kross