Форсирование часового пояса "+0000" для RFC2822 раз в Ruby

Как я могу заставить Time.rfc2822 функция выплевывать +0000?

Ruby позволяет мне довольно легко анализировать время, отформатированное в RFC2822:

require 'time'
time = Time.parse('14 Aug 2009 09:28:32 +0000')
puts time
=> "2009-08-14 05:28:32 -0400"

Но как насчет отображения времени? Обратите внимание, что время, которое он анализировал, является местным временем. Не беспокойтесь, я могу преобразовать его обратно в UTC время с gmtime:

puts time.gmtime
=> "2009-08-14 09:28:32 UTC"

Затем я могу вернуть его в формат RFC2822:

puts time.gmtime.rfc2822
=> "Fri, 14 Aug 2009 09:28:32 -0000"

К сожалению, это не совсем то, что я хочу. Обратите внимание, что +0000 сейчас -0000, Согласно RFC2822, это потому, что:

Форму "+0000" СЛЕДУЕТ использовать для указания часового пояса в универсальном времени. Хотя "-0000" также указывает универсальное время, оно используется для указания того, что время было сгенерировано в системе, которая может находиться в местном часовом поясе, отличном от универсального времени, и, следовательно, указывает, что дата-время не содержит информации о местном времени. зона.

Отлично - так как я могу заставить +0000 кроме обезьяны-исправления rfc2822 функционировать?

2 ответа

Решение

Вот мое решение monkeypatch:

class Time
  alias_method :old_rfc2822, :rfc2822
  def rfc2822
    t = old_rfc2822
    t.gsub!("-0000", "+0000") if utc?
    t
  end
end

Если у вас есть решение не от Monkeypatch, я бы хотел его увидеть!

Самый простой способ, если вам не нужно использовать в нескольких местах

 Time.now.gmtime.rfc2822.sub(/(-)(0+)$/, '+\2')
 => "Fri, 31 Mar 2017 08:39:04 +0000"

или как версия статического (одноэлементного) метода

require 'time'
module MyCustomTimeRFC
  def custom_rfc2822(time)
    time.gmtime.rfc2822.sub(/(-)(0+)$/, '+\2')
  end

  module_function :custom_rfc2822
end

t = Time.now
p MyCustomTimeRFC.custom_rfc2822(t)
#=> "Fri, 31 Mar 2017 08:43:15 +0000"

или как расширение модуля, если вам нравится стиль oop с гибкостью ruby.

require 'time'
module MyCustomTimeRFC
  def custom_rfc2822
    gmtime.rfc2822.sub(/(-)(0+)$/, '+\2')
  end
end

t = Time.now
t.extend(MyCustomTimeRFC)
p t.custom_rfc2822
#=> "Fri, 31 Mar 2017 08:43:15 +0000"
Другие вопросы по тегам