5

如何强制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

4

2 回答 2

4

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

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

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

于 2009-08-18T01:28:14.743 回答
0

如果您不需要在多个地方使用,最简单的方法

 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"

如果您喜欢具有 ruby​​ 灵活性的 oop 风格,或者作为模块扩展。

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"
于 2017-03-31T08:48:46.840 回答