Ruby (с Rails) конвертирует строку времени в секунды? - PullRequest
3 голосов
/ 07 января 2011

Итак, у меня есть строка времени ... что-то вроде

'4 hours'
'48 hours'
'3 days'
'15 minutes'

Я бы хотел перевести все это в секунды. Для '4 hours' это прекрасно работает

Time.parse('4 hours').to_i - Time.parse('0 hours').to_i
=> 14400 # 4 hours in seconds, yay

Однако, это не работает в течение 48 часов (за пределами ошибки диапазона). Он также не работает в течение 3 дней (нет информационной ошибки) и т. Д.

Есть ли простой способ конвертировать эти строки в секунды?


Ответы [ 6 ]

6 голосов
/ 07 января 2011

Что вы просите Ruby сделать с Time.parse, так это определить время суток.Это не то, что вы хотите.Все библиотеки, о которых я могу думать, похожи в этом аспекте: они заинтересованы в абсолютных временах, а не отрезках времени.

Чтобы преобразовать ваши строки в форматы времени, с которыми мы можем работать, я рекомендую использовать Chronic (gem install chronic).Чтобы преобразовать в секунды, мы можем сделать все, что связано с текущим временем, а затем вычесть это время, чтобы получить абсолютное количество секунд, по желанию.

def seconds_in(time)
    now = Time.now
    Chronic.parse("#{time} from now", :now => now) - now
end

seconds_in '48 hours'   # => 172,800.0
seconds_in '15 minutes' # => 900.0
seconds_in 'a lifetime' # NoMethodError, not 42 ;)

Пара быстрых примечаний:

  • * * * * * * * * * * * * from now * * * * * * * * * * * * * * * * * * * * * *
  • * * * * * * * * * * * * * * * * * * * * * * *] * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Г-н. * * * * * * * * * * * * * * * * * * * * * * П-точнее, что в случае, когда «Хроник» изменяется по сравнению с «Хроникой».это волшебство и время, которое мы вычитаем из результата.Это может произойти не когда-нибудь, но лучше, чем потом сожалеть, я думаю.
3 голосов
/ 07 января 2011
'48 hours'.match(/^(\d+) (minutes|hours|days)$/) ? $1.to_i.send($2) : 'Unknown'
 => 172800 seconds
3 голосов
/ 07 января 2011
4.hours => 14400 seconds
4.hours.to_i 14400
4.hours - 0.hours => 14400 seconds 

def string_to_seconds string
  string.split(' ')[0].to_i.send(string.split(' ')[1]).to_i
end

Этот вспомогательный метод будет работать, только если время указано в формате число [пробел] час (ы) / минута (ы) / секунда (с)

1 голос
/ 07 января 2011

Я уверен, что вы получите хорошую работу от хронического драгоценного камня.

Также, вот некоторая полезная информация о дате / времени в рубине

0 голосов
/ 19 ноября 2012

Chronic будет работать, но Chronic Duration лучше подходит.Он может анализировать строку и давать вам секунды.

ChronicDuration :: parse ('15 минут ') или ChronicDuration :: parse (' 4 часа)

http://everydayrails.com/2010/08/11/ruby-date-time-parsing-chronic.html

0 голосов
/ 07 января 2011
>> strings = ['4 hours', '48 hours', '3 days', '15 minutes', '2 months', '5 years', '2 decades']
=> ["4 hours", "48 hours", "3 days", "15 minutes", "2 months", "5 years", "2 decades"]
>> ints = strings.collect{|s| eval "#{s.gsub(/\s+/,".")}.to_i" rescue "Error"}
=> [14400, 172800, 259200, 900, 5184000, 157788000, "Error"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...