Ruby 的 strftime 未显示与“%Z”的时区偏移
Ruby's strftime not displaying timezone offset with '%Z'
我有以下时间对象:
[8] pry(#<#<Class:0x007f928f12f560>>)> display_num
=> 2015-02-19 09:00:00 -0600
[9] pry(#<#<Class:0x007f928f12f560>>)> display_num.is_a?(Time)
=> true
[10] pry(#<#<Class:0x007f928f12f560>>)> display_num.is_a?(DateTime)
=> false
[11] pry(#<#<Class:0x007f928f12f560>>)> display_num.strftime("%l:%M%P %Z")
=> " 9:00am "
[12] pry(#<#<Class:0x007f928f12f560>>)> display_num.strftime("%l:%M%P %z")
=> " 9:00am -0600"
我完全被难住了:
[16] pry(#<#<Class:0x007f928f12f560>>)> Time.new
=> 2015-02-02 14:09:13 -0800
[17] pry(#<#<Class:0x007f928f12f560>>)> t = Time.new
=> 2015-02-02 14:09:25 -0800
[18] pry(#<#<Class:0x007f928f12f560>>)> t.strftime("%l:%M%P %Z")
=> " 2:09pm PST"
工作正常。
上面的块中发生了什么以防止时区以人类可读的格式显示?
格式指令%Z
请求符号时区(名称或缩写); %z
是偏移量。虽然您总是知道偏移量,但您可能不知道符号时区名称。
我怀疑 display_time
就是这样。它是用偏移量初始化的,因此它没有任何符号时区名称可显示。
您也不能可靠地从偏移量派生名称;例如,-0400 可能是大西洋标准时间或东部夏令时。大多数偏移量对于它们所在的时区会有不止一种选择,而且大多数时区都有不止一种名称。
值得补充的是,如果您使用 Rails,方法 in_time_zone
中的 ActiveSupport monkey-patches 可用于通过 strftime
解决此问题:
Time.current.localtime("-06:00").strftime("TZ is: %Z") # => "TZ is: "
Time.current.in_time_zone("America/Chicago").strftime("TZ is: %Z") # => "TZ is: CDT"
Time.current.in_time_zone("America/New_York").strftime("TZ is: %Z") # => "TZ is: EDT"
参考文献:
DateAndTime::Zones#in_time_zone
时区字符串的完整列表在 ActiveSupport::TimeZone::MAPPING
中定义
我有以下时间对象:
[8] pry(#<#<Class:0x007f928f12f560>>)> display_num
=> 2015-02-19 09:00:00 -0600
[9] pry(#<#<Class:0x007f928f12f560>>)> display_num.is_a?(Time)
=> true
[10] pry(#<#<Class:0x007f928f12f560>>)> display_num.is_a?(DateTime)
=> false
[11] pry(#<#<Class:0x007f928f12f560>>)> display_num.strftime("%l:%M%P %Z")
=> " 9:00am "
[12] pry(#<#<Class:0x007f928f12f560>>)> display_num.strftime("%l:%M%P %z")
=> " 9:00am -0600"
我完全被难住了:
[16] pry(#<#<Class:0x007f928f12f560>>)> Time.new
=> 2015-02-02 14:09:13 -0800
[17] pry(#<#<Class:0x007f928f12f560>>)> t = Time.new
=> 2015-02-02 14:09:25 -0800
[18] pry(#<#<Class:0x007f928f12f560>>)> t.strftime("%l:%M%P %Z")
=> " 2:09pm PST"
工作正常。
上面的块中发生了什么以防止时区以人类可读的格式显示?
格式指令%Z
请求符号时区(名称或缩写); %z
是偏移量。虽然您总是知道偏移量,但您可能不知道符号时区名称。
我怀疑 display_time
就是这样。它是用偏移量初始化的,因此它没有任何符号时区名称可显示。
您也不能可靠地从偏移量派生名称;例如,-0400 可能是大西洋标准时间或东部夏令时。大多数偏移量对于它们所在的时区会有不止一种选择,而且大多数时区都有不止一种名称。
值得补充的是,如果您使用 Rails,方法 in_time_zone
中的 ActiveSupport monkey-patches 可用于通过 strftime
解决此问题:
Time.current.localtime("-06:00").strftime("TZ is: %Z") # => "TZ is: "
Time.current.in_time_zone("America/Chicago").strftime("TZ is: %Z") # => "TZ is: CDT"
Time.current.in_time_zone("America/New_York").strftime("TZ is: %Z") # => "TZ is: EDT"
参考文献:
DateAndTime::Zones#in_time_zone
时区字符串的完整列表在 ActiveSupport::TimeZone::MAPPING