Форсирование часового пояса "+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"