首页 > 解决方案 > 如何从Ruby中的人性化字符串中去人性化以前的时间?

问题描述

有没有办法按如下方式对持续时间字符串进行非人性化以获得实际的 utc 时间戳?

例如:“1.hour.ago 25.minute.ago 1.second.ago”转换回 Fri, 18 Oct 2019 16:09:10 UTC +00:00

站点信息显示为“17h 21m 1s 前”需要将其转换为 db datetime utc 我设法做到这一点:

"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?尝试日期时间解析不起作用。

标签: ruby

解决方案


假设"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因此更加混乱。


推荐阅读