Получить время в секундах из строки и добавить к текущему времени? - PullRequest
0 голосов
/ 27 мая 2018

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

Теперь я получаю общее количествосекунд.Я хочу сделать это в часах, минутах и ​​секундах, а затем добавить его к текущему времени, чтобы получить время следующего запуска.Есть ли простой способ сделать это?

Ответы [ 5 ]

0 голосов
/ 28 мая 2018

Если вам не нужно анализировать длительность времени, и вы просто хотите определить ее в своем коде, используйте ActiveSupport::Duration для удобства чтения.(добавьте гем в ваш Gemfile и прочитайте руководство о том, как его использовать)

Тогда вы можете использовать его так:

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

См. Документацию API ActiveSupport :: Duration

Если вам нужно определить следующий прогон с помощью пользовательского ввода, рекомендуется использовать ISO 8601 для определения продолжительностивремя: https://en.wikipedia.org/wiki/ISO_8601#Durations

Длительность ISO 8601 является разборчивой:

ActiveSupport::Duration.parse('PT15H37M5S') # => 15 hours, 37 minutes, and 5 seconds (duration)
0 голосов
/ 27 мая 2018

вы можете преобразовать вашу строку в секунды из этого метода

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

, теперь получить следующее время выполнения, используя

Time.at(next_run_time)

получить желаемый формат времени, используя метод strftime, в вашем случае

Time.at(next_run_time).strftime("%Hh %Mm %Ss")
0 голосов
/ 27 мая 2018

DateTime#+ принимает 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)>
# ]
0 голосов
/ 27 мая 2018

Во-первых, вместо split строки можно использовать Time#parse метод .Убедитесь, что вы также нуждаетесь в библиотеке.

require 'time'
=> true
Time.parse('15h 37m 5s')
=> 2018-05-27 15:37:05 +0300

Возвращает новый объект класса Время и имеет несколько действительно полезных для вас методов - #sec, #min, #hour.

time = Time.parse('15h 37m 5s')
time.sec       #=> 5
time.min       #=> 37
time.hour      #=> 15

Добавление одного объекта Time к другому довольно просто, поскольку вы можете сделать это только с помощью seconds.Простое решение для текущей проблемы было бы:

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

Надеюсь, это ответит на ваш вопрос!:)

0 голосов
/ 27 мая 2018

Следующий метод может использоваться для вычисления количества секунд из строки.

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) +....

Тогда

Time.now + seconds(str)

Примеры возможных значений str следующие: ”3h 26m 41s”, ”3h 26m”, ”3h 41s””41s 3h”, ”3h”, ”41s” и ””.

Вместо этого можно было бы написать рабочую строку метода следующим образом.это менее читабельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...