在Ruby中将RFC2822时间强制为“ +0000”时区

Bkk*_*rad 5 ruby formatting time rfc822 rfc2822

我该如何强制该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"
Run Code Online (Sandbox Code Playgroud)

但是显示时间呢?请注意,它解析的时间是本地时间。不用担心,我可以使用以下命令将其转换为UTC时间gmtime

puts time.gmtime
=> "2009-08-14 09:28:32 UTC"
Run Code Online (Sandbox Code Playgroud)

然后,我可以将其放回RFC2822格式:

puts time.gmtime.rfc2822
=> "Fri, 14 Aug 2009 09:28:32 -0000"
Run Code Online (Sandbox Code Playgroud)

不幸的是,这不是我想要的。请注意,+0000现在是-0000。根据RFC2822,这是因为:

格式“ +0000”应用于表示世界标准时间。尽管“ -0000”也表示世界标准时间,但它用于指示时间是在可能位于世界标准时间以外的本地时区的系统上生成的,因此指示日期时间不包含有关当地时间的信息。区。

太好了- +0000除了猴子修补rfc2822功能,我该如何强制?

Bkk*_*rad 4

这是我的猴子补丁解决方案:

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

如果您有非猴子补丁解决方案,我很乐意看到它!