Ruby:将时间转换为秒?

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

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

您可以使用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 seconds_since_midnight:

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

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

 require 'time' m = Time.parse('00:00') t = Time.parse('10:30') (t.to_i - m.to_i) => 37800 

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

又一个实施:

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

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

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

会做的伎俩。

你可以简单地使用

 Time.parse("10:30").seconds_since_midnight 
 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") 

所有伟大的答案,这是我最终使用。

在普通ruby中,最快的是时间部分的总和:

 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 

我非常喜欢这些答案,特别是Teddy的整洁。

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

 Time.now.to_i % 86400 

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