Ruby/Rails 中字符串的日期时间替换

DateTime substitution from a string in Ruby/Rails

假设我有这个字符串来自一些外部 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) 中提取日期时间并将其转换为 EST,然后将其换回到 <strong> 标签周围的字符串?

如果字符串每次都完全相同,我会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>"

修改到满意后,您应该可以使用DateTime.strptime to parse the date you've been given and then 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(, "%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   
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.")