是否有Ruby 1.8.7 time.strftime%z错误?

rol*_*usa 4 ruby timezone ruby-on-rails ruby-1.8

我遇到了Ruby 1.8.7 strftime的问题,其中%z在我将时间转换为UTC后返回本地时间.

我正在做以下事情:

>> t = Time.now
=> Mon Dec 19 15:20:16 -0800 2011
>> t.strftime("%z")
=> "-0800"

>> t = Time.now.utc
=> Mon Dec 19 23:20:28 UTC 2011
>> t.strftime("%z")
=> "-0800"
Run Code Online (Sandbox Code Playgroud)

即使我将时间更改为UTC,格式化的时区也会默认为我的本地PST -0800.

这是一个已知的问题?有办法解决吗?

mu *_*ort 5

请注意,精细的1.8.7手册没有提到%z:

...
%w - Day of the week (Sunday is 0, 0..6)
%x - Preferred representation for the date alone, no time
%X - Preferred representation for the time alone, no date
%y - Year without a century (00..99)
%Y - Year with century
%Z - Time zone name
%% - Literal ``%'' character
Run Code Online (Sandbox Code Playgroud)

1.9.3版本确实支持%z:

Time zone:
  %z - Time zone as hour and minute offset from UTC (e.g. +0900)
          %:z - hour and minute offset from UTC with a colon (e.g. +09:00)
          %::z - hour, minute and second offset from UTC (e.g. +09:00:00)
  %Z - Time zone abbreviation name
Run Code Online (Sandbox Code Playgroud)

%z产生任何东西的事实似乎是一个无证的,可能是偶然的实现细节.

你可以%Z在1.8.7和1.9.3中使用; 例如,您在1.8.7中得到这些结果:

>> t = Time.now
=> Mon Dec 19 16:46:06 -0800 2011
>> t.zone
=> "PST"
>> t.strftime('%z %Z')
=> "-0800 PST"
>> t = Time.now.utc
=> Tue Dec 20 00:46:27 UTC 2011
>> t.zone
=> "UTC"
>> t.strftime('%z %Z')
=> "-0800 UTC"
Run Code Online (Sandbox Code Playgroud)

这将为您提供UTC,PST,EDT和类似常用缩写的时区.如果你想要偏移量,你应该gmt_offset1.9.31.8.7中使用:

>> Time.now.gmt_offset
=> -28800
>> Time.now.utc.gmt_offset
=> 0
Run Code Online (Sandbox Code Playgroud)

请注意,gmt_offset它以秒为单位给出偏移量.

  • 使用gmt_offset在1.8中快速执行"%z":`time = Time.now; "#{time.gmt_offset <0?" - ":"+"}%02d%02d"%(time.gmt_offset/60).abs.divmod(60)` (2认同)