如何将10:30这样的时间转换为秒?Ruby中是否有某种内置函数来处理这个问题?基本上试图计算从午夜(00:00)到一天中特定时间(如10:30或18:45)的秒数。
1sbrub3j1#
你可以使用DateTime#parse将一个字符串转换成一个DateTime对象,然后将小时乘以3600,将分钟乘以60,得到秒数:
DateTime#parse
DateTime
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
字符串正如Josh Lee在评论中指出的那样,如果你有ActiveSupport,你也可以使用Time#seconds_since_midnight:
Time#seconds_since_midnight
require 'active_support' Time.parse("10:30").seconds_since_midnight #=> 37800.0
型
mtb9vblg2#
另一个实现:
Time.now.to_i - Date.today.to_time.to_i # seconds since midnight
字符串
8fsztsew3#
内置的time库扩展了Time类来解析字符串,所以你可以使用它。它们最终表示为自UNIX纪元以来的秒,所以转换为整数和减法应该可以得到你想要的。
require 'time' m = Time.parse('00:00') t = Time.parse('10:30') (t.to_i - m.to_i) => 37800
字符串在ActiveSupport中也有一些糖来处理这些类型的事情。
0g0grzrc4#
也许有一个更简单的方法,但是:
t = Time.parse("18:35") s = t.hour * 60 * 60 + t.min * 60 + t.sec
字符串就可以了
qltillow5#
你可以简单地使用
Time.parse("10:30").seconds_since_midnight
c9qzyr3d6#
我非常喜欢这些答案,特别是Teddy's,因为它很整洁。有一件事需要注意。Teddy的答案给出了当前地区的第二天,我无法将Date.today.to_time转换为UTC。我最终采用了以下解决方案:
Date.today.to_time
Time.now.to_i % 86400
字符串它是基于这样一个事实,即Time.now.to_i给出了自Unix纪元以来的秒数,无论您当前所在的时区是什么,它总是1970-01-01T00:00:00Z。而且一天中也有86400秒。因此,这个解决方案将始终给出自上次UTC午夜以来的秒数。
Time.now.to_i
1970-01-01T00:00:00Z
yhqotfr87#
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")
字符串所有伟大的答案,这就是我最终使用的。
mwngjboj8#
在普通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
8条答案
按热度按时间1sbrub3j1#
你可以使用
DateTime#parse
将一个字符串转换成一个DateTime
对象,然后将小时乘以3600,将分钟乘以60,得到秒数:字符串
正如Josh Lee在评论中指出的那样,如果你有ActiveSupport,你也可以使用
Time#seconds_since_midnight
:型
mtb9vblg2#
另一个实现:
字符串
8fsztsew3#
内置的time库扩展了Time类来解析字符串,所以你可以使用它。它们最终表示为自UNIX纪元以来的秒,所以转换为整数和减法应该可以得到你想要的。
字符串
在ActiveSupport中也有一些糖来处理这些类型的事情。
0g0grzrc4#
也许有一个更简单的方法,但是:
字符串
就可以了
qltillow5#
你可以简单地使用
字符串
c9qzyr3d6#
我非常喜欢这些答案,特别是Teddy's,因为它很整洁。
有一件事需要注意。Teddy的答案给出了当前地区的第二天,我无法将
Date.today.to_time
转换为UTC。我最终采用了以下解决方案:字符串
它是基于这样一个事实,即
Time.now.to_i
给出了自Unix纪元以来的秒数,无论您当前所在的时区是什么,它总是1970-01-01T00:00:00Z
。而且一天中也有86400秒。因此,这个解决方案将始终给出自上次UTC午夜以来的秒数。yhqotfr87#
字符串
所有伟大的答案,这就是我最终使用的。
mwngjboj8#
在普通Ruby中,最快的是时间部分的总和:
字符串
因此,如果需要,这里有一个考虑时区的方法
型