Есть ли ошибка Ruby 1.8.7 time.strftime% z? - PullRequest
4 голосов
/ 20 декабря 2011

У меня проблема с 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"

Даже после того, как я изменил время на UTC, отформатированный часовой пояс по умолчанию становится моим локальным PST-0800.

Это известная проблема?Есть ли способ обойти это?

Ответы [ 2 ]

5 голосов
/ 20 декабря 2011

Обратите внимание, что руководство fine 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

, но версия 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

Тот факт, что %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"

. Это даст вам часовой пояс в формате UTC, PST, EDT и аналогичных общих сокращений.Если вы хотите смещение, вы должны использовать gmt_offset в обоих 1.9.3 и 1.8.7 :

>> Time.now.gmt_offset
=> -28800
>> Time.now.utc.gmt_offset
=> 0

Обратите внимание, что gmt_offset даетВы смещение в секундах.

0 голосов
/ 20 декабря 2011

Ваша проблема.

ruby-1.9.2-p290 :004 > Time.now.strftime("%z")
 => "-0500" 
ruby-1.9.2-p290 :005 > Time.now.utc.strftime("%z")
 => "+0000" 
...