Ruby:将时间转换为秒?

时间:2010-09-29 17:44:27

标签: ruby time

如何将时间转换为10:30到秒?是否有某种内置的Ruby函数来处理它?<​​/ p>

基本上试图计算从午夜(00:00)到当天特定时间(例如10:30或18:45)的秒数。

8 个答案:

答案 0 :(得分:30)

您可以使用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在评论中指出的那样,如果您有ActiveSupport,也可以使用Time#seconds_since_midnight

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

答案 1 :(得分:9)

内置的time库扩展了Time类来解析字符串,因此您可以使用它。它们最终表现为自UNIX纪元以来的秒数,因此转换为整数和减去应该可以得到你想要的东西。

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

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

ActiveSupport中还有一些糖来处理这些类型的事情。

答案 2 :(得分:9)

又一个实施:

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

答案 3 :(得分:3)

也许有一种更简洁的方式,但是:

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

会做到这一点。

答案 4 :(得分:2)

您只需使用

即可
Time.parse("10:30").seconds_since_midnight

答案 5 :(得分: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")

所有好的答案,这就是我最终使用的。

答案 6 :(得分:1)

我非常喜欢这些答案,特别是Teddy's因为它的整洁。

有一点需要注意。 Teddy的答案给出了当前区域中的第二天,我还没有能够将Date.today.to_time转换为UTC。我最终得到了这个解决方法:

Time.now.to_i % 86400

它基于以下事实:Time.now.to_i自Unix Epoch 以来的秒,始终为1970-01-01T00:00:00Z,无论您当前的时区如何。事实上,一天中也有86400秒。因此,此解决方案将始终为您提供自上次 UTC 午夜以来的秒数。

答案 7 :(得分: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