Как дегуманизировать время назад из гуманизированных строк в Ruby? - PullRequest
1 голос
/ 18 октября 2019

Есть ли способ дегуманизировать строку продолжительности следующим образом, чтобы получить фактическую метку времени utc?

Например: "1.hour.ago 25.minute.ago 1.second.ago" конвертировать обратно Пт, 18 октября 2019 16:09:10 UTC +00: 00

theинформация сайта имеет вид «17h 21m 1s ago», необходимо преобразовать его в db datetime, но мне удается это сделать:

"17h 21m 1s ago".gsub("h", '.hour.ago').gsub("m", '.minute.ago').gsub("s ago", '.second.ago')
# ==> "17.hour.ago 21.minute.ago 1.second.ago"

Но как удалить строковую часть и преобразовать в метод datetime? Попытка синтаксического анализа даты и времени не сработала.

Ответы [ 3 ]

2 голосов
/ 18 октября 2019

Если вы работаете с форматом "17h 21m 1s ago", то вы можете использовать Time#advance для выполнения работы:

def when_was(string)
  time = Time.now.utc

  string.split(/\s+/).each do |part|
    case (part)
    when /\A(\d+)h\z/
      time = time.advance(hours: -$1.to_i)
    when /\A(\d+)m\z/
      time = time.advance(minutes: -$1.to_i)
    when /\A(\d+)s\z/
      time = time.advance(seconds: -$1.to_i)
    end
  end

  time
end

p when_was("17h 21m 1s ago")
# => 2019-10-18 01:31:36 UTC

Вы также можете сделать это с помощью Time.now.utc - 17.hours - 21.minutes - 1.second, но этовключает в себя динамическую диспетчеризацию с send, так что это более грязно.

2 голосов
/ 18 октября 2019

Готовое решение с использованием ronic_duration gem:

require 'chronic_duration'

time_in_seconds = ChronicDuration.parse('17h 21m 1s ago')

p Time.now - time_in_seconds # => 2019-10-18 03:50:47 +0200

Оно может понимать m, min и т. Д. Из коробки.

1 голос
/ 18 октября 2019

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

time_in_string = "1.hour.ago 25.minute.ago 1.second.ago"
time_info = time_in_string.scan(/\d+/).map(&:to_i)
#=> [1, 25, 1]
time_in_seconds = time_info.zip([3600, 60, 1]).sum{ |x, y| x * y }
=> 5101
Time.now
#=> 2019-10-18 22:56:14 +0300
Time.now - time_in_seconds.seconds
#=> 2019-10-18 21:31:13 +0300

Как метод:

def time_from_string(time_in_string)
  time_info = time_in_string.scan(/\d+/).map(&:to_i)
  time_in_seconds = time_info.zip([3600, 60, 1]).sum{ |x, y| x * y }
  Time.now - time_in_seconds.seconds
end

p time_from_string(time_in_string)
#=> 2019-10-18 21:37:10 +0300
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...