Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 鲁比:把时间转换成秒?_Ruby_Time - Fatal编程技术网

Ruby 鲁比:把时间转换成秒?

Ruby 鲁比:把时间转换成秒?,ruby,time,Ruby,Time,如何将10:30这样的时间转换为秒?是否有某种内置的Ruby函数来处理这个问题 基本上是计算从午夜(00:00)到一天中某个特定时间(如10:30或18:45)的秒数。您可以使用将字符串转换为DateTime对象,然后将小时乘以3600,将分钟乘以60,得到秒数: require 'date' # DateTime.parse throws ArgumentError if it can't parse the string if dt = DateTime.parse("10:30") re

如何将10:30这样的时间转换为秒?是否有某种内置的Ruby函数来处理这个问题

基本上是计算从午夜(00:00)到一天中某个特定时间(如10:30或18:45)的秒数。

您可以使用将字符串转换为
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,还可以使用:

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

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

t = Time.parse("18:35")
s = t.hour * 60 * 60 + t.min * 60 + t.sec
内置库扩展了Time类来解析字符串,因此您可以使用它。从UNIX时代开始,它们最终被表示为秒,因此转换为整数和减法应该可以得到您想要的结果

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

(t.to_i - m.to_i)
=> 37800
ActiveSupport中还有一些糖可以处理这些类型的事情

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")

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

另一个实现:

Time.now.to_i - Date.today.to_time.to_i # seconds since midnight
你可以简单地使用

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

在纯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的回答给出了当前地区的第二天,我无法将
Date.today.to_time
转换为UTC。我最终采用了以下解决方法:

Time.now.to_i % 86400

它基于这样一个事实,即
Time.now.to_i
给出了自Unix纪元以来的秒数,它始终是
1970-01-01T00:00:00Z
,而不管您当前的时区如何。事实上一天也有86400秒。因此,此解决方案将始终为您提供自上次UTC午夜起的秒数。

这似乎需要积极的支持。此外,还有一种自午夜起的
seconds\u
方法。关于ArgumentError…有没有办法将数字转换为时间?假设输入为“8”…我想转换为“8:00”@jleedev Updated,改为使用
DateTime\parse
。当应用于DateTime对象时,这将返回一个带有当前日期的字符串,如果计算时间与午夜重叠,这可能会混淆问题,也可能不会混淆。有没有办法将10:30解析为10分30秒?