2016-11-09 125 views
2
Foo.first = {id: 1, start:2000-01-01 07:00:00 UTC, end: 2000-01-01 12:00:00 UTC, total_hours_worked: nil} 

end在此處用作示例。計算軌道中的總小時數

我創建Foot.time兩個startend如我只需要小時/分鐘。我從來沒有與時間對象合作過,所以忍受着我。

我需要得到與分的總小時startend

start = Foo.find(1).start 
end = Foo.find(1).end 
start + end #=> errors 
start.to_i + end.to_i = 1893438000 #=> What's that? 
distance_of_time_in_words(start.to_i + end.to_i) #=> "about 60 years" What? 

林期待5:00:00。我知道,5:00:00真的意味着5am但上下文將使用不同。

做過幾次搜索我見過this。我真的不想在Rails/Ruby中使用更多的「應該在方法中烘焙」的寶石。

我的問題會找到答案我真正想要達到(獲得總工作時間爲一週):

Foo.pluck(:total_hours_worked).sum(&:to_d) #=> best way? 

:total_hours_worked將是一個字符串,只是爲了讓事情變得更簡單。

回答

3

這裏是你將怎樣得到你想要的格式("5:00:00"):

# Monkeypatch Integer class to add a new method 
class Integer 
    def pretty_duration 
    seconds = self % 60 
    minutes = (self/60) % 60 
    hours = self/(60 * 60) 

    format('%02d:%02d:%02d', hours, minutes, seconds) 
    end 
end 

# Get start and end time converted into integers 
timestart = (Time.now - 5.hours).to_i 
timeend = Time.now.to_i 

# Use pretty_duration method. 
# P.S. Difference between time objects already gives you a number, but we need Integer 
(timeend - timestart).pretty_duration 
#=> "05:00:00" 

這安裝程序允許你不要依賴Rails視圖助手(distance_of_time_in_words),因爲你mig需要將時間格式化到視圖之外的某處。

我的問題會找到答案我真正想要實現 (獲得總工作時間爲一週):

Foo.pluck(:total_hours_worked).sum(&:to_d)#=>最好的方法?其中 :total_hours_worked將是一個字符串,只是爲了減少 複雜。

的最有效方式(如果你有total_hours_worked爲正確格式的字符串定居)將被累加起來已經澆鑄成十進制的分貝水平:

Foo.sum('total_hours_worked::decimal') 
+0

你喜歡monkeypatching,呃? :) –

+0

@SergioTulentsev沒有這麼多,只是我碰巧在我目前的應用程序中使用這一個:) –

+0

關於這一切有趣的是,我嘗試了這一點,我吃了一些猴子堅果。哈哈。我會確認。 – Sylar

0

,因爲你需要開始和結束之間的時間,你寫的代碼應該是:

distance_of_time_in_words(end.to_i - start.to_i) 

您應該能夠使用格式化方法的輸出描述here

+0

現貨! '大約5個小時'。但如何把它作爲'5:00:00'? – Sylar

+0

@Sylar嘗試distance_of_time_in_words((end.to_i - start.to_i)/ 1.hour) – 2016-11-09 06:41:49

+0

不,我不到一分鐘# – Sylar

0

end是一個關鍵字。您無法爲其分配值。現在

,讓時差:

start = "2000-01-01 07:00:00 UTC".to_time 
endtime = "2000-01-01 12:00:00 UTC".to_time 
difference = ((endtime - start)/1.hour) 
# => 5.0 

或使用輔助

distance_of_time_in_words(endtime, start) 
# => "about 5 hours" 
0

使用下面的代碼來獲得區別並獲得小時格式爲「5:00:00」

distance_of_time_in_words(end.to_i - start.to_i).strftime("%H%M%S") 

t.strftime("%H:%M:%S") > "22:49:27"