Ruby 从字符串中获取以秒为单位的时间并添加到当前时间?
timestr='15h 37m 5s' 我想从上面的字符串中获取小时分秒,并将其添加到当前时间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
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)
这涵盖了所有案例。谢谢这包括了所有的案子。谢谢