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,timestr='15h 37m 5s' 我想从上面的字符串中获取小时分秒,并将其添加到当前时间 def next_run timestr = '15h 37m 5s' timearr = timestr.split(' ').map { |t| t.to_i } case timearr.count when 3 next_ = (timearr[0] * 3600) + (timearr[1] * 60) + timearr[2] wh

timestr='15h 37m 5s'

我想从上面的字符串中获取小时分秒,并将其添加到当前时间

  def next_run
    timestr = '15h 37m 5s'
    timearr = timestr.split(' ').map { |t| t.to_i }
    case timearr.count
    when 3
      next_ = (timearr[0] * 3600) + (timearr[1] * 60) + timearr[2]
    when 2
      next_ = (timearr[1] * 60) + timearr[2]
    when 1
      next_ = timearr[2]
    else
      raise 'Unknown length for timestr'
    end
    time_to_run_in_secs =  next_
  end

现在我得到了总秒数。我想将其转换为小时、分钟和秒,然后将其添加到当前时间以获得下一个运行时间。有什么简单的方法可以做到这一点吗?

以下方法可用于计算字符串的秒数

def seconds(str)
  3600 * str[/\d+h/].to_i + 60 * str[/\d+m/].to_i + str[/\d+s/].to_i
end
注意
nil.to#i=>0
。一个微小的变化是编写
3600*(str[/\d+h/]| | 0)+……

然后

str
的可能值示例如下:
“3h 26m 41s”
“3h 26m”
“3h 41s”
“41s 3h”
“3h”
“41s”
“41s”

我们可以将该方法的操作行写为如下

%w| s m h |.each_with_index.sum { |s,i| 60**i * str[/\d+#{s}/].to_i }

尽管如此,我发现可读性较差。

以下方法可用于计算字符串中的秒数

def seconds(str)
  3600 * str[/\d+h/].to_i + 60 * str[/\d+m/].to_i + str[/\d+s/].to_i
end
注意
nil.to#i=>0
。一个微小的变化是编写
3600*(str[/\d+h/]| | 0)+……

然后

str
的可能值示例如下:
“3h 26m 41s”
“3h 26m”
“3h 41s”
“41s 3h”
“3h”
“41s”
“41s”

我们可以将该方法的操作行写为如下

%w| s m h |.each_with_index.sum { |s,i| 60**i * str[/\d+#{s}/].to_i }
虽然比较枯燥,但我发现可读性较差。

接受
Rational
实例作为要添加的天数。您只需将秒数转换为天数,然后简单地添加到当前时间戳:

DateTime.now.tap do |dt|
  break [dt, dt + Rational(100, 3600 * 24) ]
end
#⇒ [
#    [0] #<DateTime: 2018-05-27T11:13:00+02:00 ((2458266j,33180s,662475814n),+7200s,2299161j)>,
#    [1] #<DateTime: 2018-05-27T11:14:40+02:00 ((2458266j,33280s,662475814n),+7200s,2299161j)>
# ]
DateTime.now.tap do|dt|
中断[dt,dt+Rational(1003600*24)]
结束
#⇒ [
#    [0] #,
#    [1] #
# ]
接受
Rational
实例作为要添加的天数。您只需将秒数转换为天数,然后简单地添加到当前时间戳:

DateTime.now.tap do |dt|
  break [dt, dt + Rational(100, 3600 * 24) ]
end
#⇒ [
#    [0] #<DateTime: 2018-05-27T11:13:00+02:00 ((2458266j,33180s,662475814n),+7200s,2299161j)>,
#    [1] #<DateTime: 2018-05-27T11:14:40+02:00 ((2458266j,33280s,662475814n),+7200s,2299161j)>
# ]
DateTime.now.tap do|dt|
中断[dt,dt+Rational(1003600*24)]
结束
#⇒ [
#    [0] #,
#    [1] #
# ]

首先,您可以使用
Time#parse来代替
拆分字符串。确保您也需要该库

require 'time'
=> true
Time.parse('15h 37m 5s')
=> 2018-05-27 15:37:05 +0300
这将返回一个新的类对象,它有一些非常有用的方法供您使用-
秒、\min、\hour

time = Time.parse('15h 37m 5s')
time.sec       #=> 5
time.min       #=> 37
time.hour      #=> 15
将一个
时间
对象添加到另一个对象非常简单,因为只需
。解决当前问题的简单方法是:

def next_run
  time = Time.parse('15h 37m 5s')
  seconds_to_add = time.hour * 3600 + time.min * 60 + time.sec
  Time.now + seconds_to_add
end

希望这能回答你的问题!:)

首先,您可以使用
Time#parse
,而不是
split
ing字符串。确保您也需要该库

require 'time'
=> true
Time.parse('15h 37m 5s')
=> 2018-05-27 15:37:05 +0300
这将返回一个新的类对象,它有一些非常有用的方法供您使用-
秒、\min、\hour

time = Time.parse('15h 37m 5s')
time.sec       #=> 5
time.min       #=> 37
time.hour      #=> 15
将一个
时间
对象添加到另一个对象非常简单,因为只需
。解决当前问题的简单方法是:

def next_run
  time = Time.parse('15h 37m 5s')
  seconds_to_add = time.hour * 3600 + time.min * 60 + time.sec
  Time.now + seconds_to_add
end

希望这能回答你的问题!:)

您可以使用此方法将字符串转换为秒

def seconds(str)
  (3600 * str[/\d+(h|H)/].to_i) + (60 * str[/\d+(m|M)/].to_i) + (str[/\d+(s|S)/].to_i)
end
然后使用方法将当前时间转换为秒

next_run_time = Time.now.to_i + seconds(<Your Time String>)
在您的例子中,使用strftime方法获得所需的时间格式

Time.at(next_run_time).strftime("%Hh %Mm %Ss")

您可以使用此方法将字符串转换为秒

def seconds(str)
  (3600 * str[/\d+(h|H)/].to_i) + (60 * str[/\d+(m|M)/].to_i) + (str[/\d+(s|S)/].to_i)
end
然后使用方法将当前时间转换为秒

next_run_time = Time.now.to_i + seconds(<Your Time String>)
在您的例子中,使用strftime方法获得所需的时间格式

Time.at(next_run_time).strftime("%Hh %Mm %Ss")

如果您不需要解析持续时间,只想在代码中定义它,请使用
ActiveSupport::duration
以提高可读性。(添加到您的GEM文件中,并阅读如何使用它)

然后你可以这样使用它:

require 'active_support'
require 'active_support/core_ext/integer'    

DURATION = 15.hours + 37.minutes + 5.seconds
# use DURATION.seconds or DURATION.to_i to get the seconds

def next_run
  Time.now + DURATION
end

如果需要通过用户输入定义下一次运行,最好使用ISO 8601定义持续时间:

ISO 8601持续时间是可解析的:

ActiveSupport::Duration.parse('PT15H37M5S') # => 15 hours, 37 minutes, and 5 seconds (duration)

如果您不需要解析持续时间,只想在代码中定义它,请使用
ActiveSupport::duration
以提高可读性。(添加到您的GEM文件中,并阅读如何使用它)

然后你可以这样使用它:

require 'active_support'
require 'active_support/core_ext/integer'    

DURATION = 15.hours + 37.minutes + 5.seconds
# use DURATION.seconds or DURATION.to_i to get the seconds

def next_run
  Time.now + DURATION
end

如果需要通过用户输入定义下一次运行,最好使用ISO 8601定义持续时间:

ISO 8601持续时间是可解析的:

ActiveSupport::Duration.parse('PT15H37M5S') # => 15 hours, 37 minutes, and 5 seconds (duration)

这涵盖了所有案例。谢谢这包括了所有的案子。谢谢