Как заставить Rails интерпретировать время как находящееся в определенном часовом поясе? - PullRequest
0 голосов
/ 22 февраля 2011

Как установить часовой пояс в Ruby 1.8.7?

В следующих примерах системный часовой пояс PST (-8: 00 часов от UTC)

Учитывая время (21 Feb 2011, 20:45), предположим, что время указано в EST:

#this interprets the time as system time zone, i.e. PST
Time.local(2011,02,21,20,45) 
  #=> Mon Feb 21 20:45:00 -0800 2011

#this **converts** the time into EST, which is wrong!
Time.local(2011,02,21,20,45).in_time_zone "Eastern Time (US & Canada)" 
  #=> Mon, 21 Feb 2011 23:45:00 EST -05:00

Но желаемый вывод: Mon Feb 21 20:45:00 -0500 2011 (обратите внимание на -0500 (EST), а не на -0800 (PST) и час тот же, то есть 20, а не 23)

ОБНОВЛЕНИЕ (см. Лучшую версию этого ниже)

Мне удалось заставить это работать,но мне это не нравится:

DateTime.new(2011,02,21,20,45).change :offset => -(300.0 / 1440.0)
  # => Mon, 21 Feb 2011 20:45:00 +0500

Where
  300 = 5 hrs x 60 minutes
  1440 = number of minutes in a day

or the "right" way:

DateTime.civil(2011,02,21,20,45,0,Rational(-5, 24))

Вопрос : Теперь, есть ли способ определить точный (т. е. питание для летнего времени и т. д.)Смещение UTC от Time.zone, чтобы я мог передать его методу изменения?

Ссылка: DateTime::change метод

ОБНОВЛЕНИЕ (лучшая версия)

Спасибо @ctcherry за помощь!

Определите точную информацию о часовом поясе с Time.zone:

DateTime.civil(2011,02,21,20,45,0,Rational((Time.zone.tzinfo.current_period.utc_offset / 3600), 24))

Ответы [ 2 ]

1 голос
/ 22 февраля 2011

В ruby ​​1.8.7, кажется, не очень легко сделать то, что просят, согласно документации:

http://www.ruby -doc.org / ядро-1.8.7 / классы / Time.html

Однако в 1.9 это выглядит намного проще, передав смещение часового пояса методу localtime () объекта Time:

http://www.ruby -doc.org / ядро ​​/ классы / Time.html # M000346

UPDATE

Смещение для Time.zone легко, поскольку сам по себе является объектом: (Это в консоли Rails)

ruby-1.8.7-p248 :001 > Time.zone
 => #<ActiveSupport::TimeZone:0x103150190 @current_period=nil, @name="Central Time (US & Canada)", @tzinfo=#<TZInfo::TimezoneProxy: America/Chicago>, @utc_offset=nil> 
ruby-1.8.7-p248 :002 > Time.zone.utc_offset
 => -21600 
ruby-1.8.7-p248 :003 > Time.zone.formatted_offset
 => "-06:00" 
0 голосов
/ 22 февраля 2011

Так что я думаю, что это (почти) выполнит то, что вы хотите:

require 'time'
t = "21 Feb 2011, 20:45"
Time.parse(t)           # => Mon Feb 21 20:45:00 -0700 2011
t += " -05:00"          # this is the trick
Time.parse(t)           # => Mon Feb 21 18:45:00 -0700 2011

Он по-прежнему возвращает время, основанное на часовом поясе вашей системы, но фактическое время - это правильное время, которое вы ищете.

Кстати, это проверено на 1.8.7-p334.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...