Принудительный часовой пояс +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?


person Bkkbrad    schedule 18.08.2009    source источник
comment
Если вы установите часовой пояс на универсальное время перед вызовом gmtime.rfc2882, вы получите соответствующий вывод? Похоже, он сообщает то, что должен сообщать, поскольку я думаю, что Time.zone по умолчанию должен быть установлен в вашу локальную зону.   -  person Bill D    schedule 18.08.2009
comment
Я не уверен, что именно вы имеете в виду. Однако я обнаружил, что класс DateTime намного лучше; DateTime.parse('14 Aug 2009 09:28:32 +0000').rfc2822 дает "Fri, 14 Aug 2009 09:28:32 +0000".   -  person Bkkbrad    schedule 18.08.2009
comment
Боже, это странно... и да: мои мысли о часовом поясе немного запутались. Возиться с консолью, чтобы придумать что-нибудь для вас, помогло мне разобраться... не дало мне, к сожалению, ничего, чем можно было бы с вами поделиться.   -  person Bill D    schedule 18.08.2009


Ответы (2)


Вот мое решение для обезьяны:

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

Если у вас есть решение, не связанное с Monkeypatch, я с удовольствием на него посмотрю!

person Bkkbrad    schedule 18.08.2009

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

 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"
person Adam    schedule 31.03.2017