2010-09-29 127 views
15

如何將10:30的時間轉換爲秒?是否有某種內置的Ruby函數來處理?Ruby:將時間轉換爲秒?

基本上試圖找出從午夜(00:00)到當天特定時間(如10:30或18:45)的秒數。

回答

26

您可以使用DateTime#parse把一個字符串轉換爲DateTime對象,然後通過3600和60分鐘乘以小時才秒數:

require 'date' 

# DateTime.parse throws ArgumentError if it can't parse the string 
if dt = DateTime.parse("10:30") rescue false 
    seconds = dt.hour * 3600 + dt.min * 60 #=> 37800 
end 

由於jleedev在評論中指出,你也可以使用Time#seconds_since_midnight如果你有的ActiveSupport:

require 'active_support' 
Time.parse("10:30").seconds_since_midnight #=> 37800.0 
+0

這似乎需要主動支持。 – 2010-09-29 17:59:51

+4

另外,還有'seconds_since_midnight'方法。 – 2010-09-29 18:01:01

+0

關於ArgumentError ...有沒有辦法將數字轉換爲時間?所以說輸入只是「8」...我想要轉換爲「8:00」 – Shpigford 2010-09-29 18:01:23

3

也許還有一個更簡潔的方式,而是:

t = Time.parse("18:35") 
s = t.hour * 60 * 60 + t.min * 60 + t.sec 

會做的伎倆。

8

內置的time庫擴展了Time類來解析字符串,所以你可以使用它。它們最終表示爲UNIX時代以來的秒數,所以轉換爲整數並減去應該得到你想要的。

require 'time' 
m = Time.parse('00:00') 
t = Time.parse('10:30') 

(t.to_i - m.to_i) 
=> 37800 

還有一些糖的ActiveSupport來處理這類事情。

+0

注意。當應用於DateTime對象時,這將返回一個包含當前日期的字符串,如果計算重疊午夜,這可能會或可能不會混淆事項。 – Jerome 2017-03-21 13:04:49

1
require 'time' 

def seconds_since_midnight(time) 
    Time.parse(time).hour * 3600 + Time.parse(time).min * 60 + Time.parse(time).sec 
end 

puts seconds_since_midnight("18:46") 

所有優秀的答案,這是我最終使用。

7

又一實現:

Time.now.to_i - Date.today.to_time.to_i # seconds since midnight 
1

您可以簡單地使用

Time.parse("10:30").seconds_since_midnight 
0

在平原紅寶石最快的是時間部分的總和:

require 'benchmark' 
require 'time' 

Benchmark.bm do |x| 
    x.report('date') { 100_000.times { Time.now.to_i - Date.today.to_time.to_i } } 
    x.report('parse') { 100_000.times { Time.now.to_i - Time.parse('00:00').to_i } } 
    x.report('sum') { 100_000.times { Time.now.hour * 3600 + Time.now.min * 60 + Time.now.sec } } 
end 

     user  system  total  real 
date 0.820000 0.000000 0.820000 ( 0.822578) 
parse 1.510000 0.000000 1.510000 ( 1.516117) 
sum 0.270000 0.000000 0.270000 ( 0.268540) 

所以,這裏是一個需要考慮時區的方法,如果需要的話

def seconds_since_midnight(time: Time.now, utc: true) 
    time = time.utc if utc 
    time.hour * 3600 + time.min * 60 + time.sec 
end