从Ruby / Rails中的字符串替换DateTime

时间:2015-04-24 15:44:05

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4 ruby-on-rails-3.2

想象一下,我的这个字符串来自一些外部api。字符串格式始终相同,包括HTML标记和所有内容。

"<p>The update time is <strong>Tuesday 04/28/15 08:30 AM PDT</strong>, please disregard the old timing.</p>"

如何从字符串(Tuesday 04/28/15 08:30 AM PDT)中提取DateTime并将其转换为EST,然后将其换回到<strong>标记周围的字符串?

3 个答案:

答案 0 :(得分:3)

如果字符串每次都完全相同,我只会gsub输出您不想要的字符串部分。

string_from_api.gsub!(/(.*<strong>|<\/strong>.*)/, '')

然后像这样使用strptime

date_time = DateTime.strptime(string_from_api, "%A %m/%d/%y %I:%M %p %Z")

(我最喜欢的strftime资源。)

然后,假设您正在使用Rails,您可以使用

更改时区
est_time = date_time.in_time_zone('EST')

然后你只需将它们全部重新组合在一起:

time_formatted = est_time.strftime("%A %m/%d/%y %I:%M %p %Z")
"<p>The update time is <strong>#{time_formatted}</strong></p>"

答案 1 :(得分:2)

def convert_time_message(message)
  regex = /<strong\>(.*?)\<\/strong>/
  time_format = '%a %m/%d/%y %H:%M %p %Z'

  parsed_time = DateTime.strptime(message.match(regex)[1], time_format)
  converted_time = parsed_time.in_time_zone('EST')

  message.gsub(regex, "<strong>#{converted_time.strftime(time_format)}</strong>")
end

convert_time_message("<p>The update time is <strong>Tuesday 04/28/15 08:30 AM PDT</strong>, please disregard the old timing.")

答案 2 :(得分:0)

您应该能够使用DateTime.strptime来解析您已经获得的日期,然后DateTime.strftime在您将其修改为满意后再次输出它。类似的东西:

s = "<p>The update time is <strong>Tuesday 04/28/15 08:30 AM PDT</strong>, please disregard the old timing."
s.sub(/<strong>(.*)<\/strong>/) do |s|
  # Parse the date in between the <strong> tags
  in_date = DateTime.strptime($1, "%A %m/%d/%y %I:%M %p %Z")
  edt_time = in_date + 3.hours
  "<strong>#{edt_time.strftime("%A %m/%d/%y %I:%M %p EDT")}</strong>"
end