2012-04-07 68 views
21

我想創建一個20分鐘10秒的DateTime實例。 我在irb中嘗試了Time和DateTime,但似乎無法找出真正有意義的方法。我只能將日期添加到DateTime對象,並且只向Time對象添加秒。ruby​​中的時間操作

沒有比總是將我想要添加的時間轉換爲秒的更好方法嗎?

回答

46

A Time是秒數sin一個時代,而一個DateTime是一個時代以來的天數,這就是爲什麼將1加到DateTime增加一整天的原因。但是,您可以添加分數一天,例如

d = DateTime.now 
d + Rational(10, 86400) 

將增加10秒d(因爲有86400秒天)。

如果您使用Rails,的ActiveSupport添加一些輔助方法,你可以做

d + 20.minutes + 10.seconds 

這將做正確的事情是dDateTimeTime。你可以自己使用ActiveSupport,現在你可以只需要一點點就可以了。我似乎記得這個東西在activesupport/duration。我相信還有其他一些可以提供時間處理幫助的寶石。

+5

就我個人而言,我更喜歡寫出'60 * 60 * 24',以使它在幻數來自哪裏時更加明顯,即使它在運行時顯然會稍微慢一些。 – 2012-04-07 17:11:13

+0

@AndrewMarshall同意,除非一個人執行這個'DateTime'操作數百萬次,否則兩個乘法操作不值得*微優化*。除非遇到性能問題,否則不要考慮它。更好的是,如何在代碼開始時聲明一個常量? 'SECONDS_PER_DAY = 60 * 60 * 24',並使用它。對於'MINUTERS_PER_DAY = 60 * 24'和'HOURS_PER_DAY = 24'可以做同樣的事情,雖然最後一個沒有必要,但是最好保持一致並列出全部。 – 2016-01-18 16:20:44

2

好,界面簡單明瞭:

t = Time.now 
t + (20 * 60 + 10) 

如果你想擁有的東西方便,你可以添加方法到Time類:

class Time 
    def add_minutes(m) 
    self + (60 * m) 
    end 
end 

但我不認爲這更簡單:

t = Time.now 
t.add_minutes(20) + 10 
+4

OP想要日期時間,而不是時間。 – steenslag 2012-04-08 10:23:17

2

假設您需要ActiveSupport或者您正在使用Rails項目。一個非常簡單的易讀的方式在Ruby來做到這一點:

DateTime + 5.minutes 
Time + 5.minutes 

.seconds, .hours, .days, .weeks, .month, .years

+16

請注意,這假定你有ActiveSupport或Rails。 – 2012-04-07 17:11:59

+0

感謝您的信息 - 我認爲這是ruby的標準行爲 – alex 2012-04-07 17:14:25

2

而且工作只是用積極支持時間延長。與試圖手動操作相比,它們非常方便且不易出錯。你可以只導入模塊,您需要:

# gem 'activesupport' 
require 'active_support/core_ext/numeric/time.rb' 
DateTime.now + 20.minutes 

NB:是的,這違背了住來自第三方庫走的StackOverflow上黨的路線,但你不應該避免使用圖書館時,他們實際上標準,顯着降低您的風險,並提供更好的代碼清晰度。