Как я изменяюсь, зона сместила какое-то время в Ruby on Rails?

Не забудьте nProf - отличный, бесплатный профилировщик.

25
задан Simone Carletti 15 November 2010 в 11:58
поделиться

5 ответов

Я использую Rails 2.0 до того, как они добавили код, который заставляет работать решение weppos. Вот что я сделал

# Silly hack, because sometimes the input_date is in the wrong timezone
temp = input_date.to_time.to_a
temp[8] = true
temp[9] = "Eastern Daylight Time"
input_date = Time.local(*temp)

Я разбил время на массив из 10 элементов, изменил часовой пояс и затем преобразовал массив обратно во время.

2
ответ дан 28 November 2019 в 18:00
поделиться

в файле environment.rb найдите следующую строку.

# Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.
# Run "rake -D time" for a list of tasks for finding time zone names.
config.time_zone = 'UTC'

Имейте в виду, что ActiveRecord и Rails всегда внутренне обрабатывают время как UTC.

5
ответ дан 28 November 2019 в 18:00
поделиться

Вы не указываете явно, как вы получаете фактическую переменную, но поскольку вы упоминаете класс Time, я предполагаю у вас есть время, используя это, и я буду ссылаться на это в своем ответе

. Часовой пояс фактически является частью класса Time (в вашем случае часовой пояс отображается как UTC). Time.now вернет смещение от UTC как часть ответа Time.now.

>> local = Time.now
=> 2012-08-13 08:36:50 +0000
>> local.hour
=> 8
>> local.min
=> 36
>> 


... в данном случае я нахожусь в том же часовом поясе, что и GMT

Преобразование между часовыми поясами

Самый простой способ, который я нашел, - это изменить смещение, используя формат '+/- HH: MM' для метода getlocal. Давайте представим, что я хочу преобразовать между временем в Дублине и временем в Нью-Йорке

?> dublin = Time.now
=> 2012-08-13 08:36:50 +0000
>> new_york = dublin + Time.zone_offset('EST')
=> 2012-08-13 08:36:50 +0000
>> dublin.hour
=> 8
>> new_york.hour
=> 3

Предполагая, что «EST» - это название часового пояса для Нью-Йорка, как указывает Дэн, иногда «EDT» является правильным TZ.

17
ответ дан 28 November 2019 в 18:00
поделиться

Вот что у меня сработало ...

def convert_zones(to_zone)
   to_zone_time = to_zone.localtime
end


# have your time set as time

time = convert_zones(time)
time.strftime("%b #{day}, %Y (%a) #{hour}:%M %p %Z")
1
ответ дан 28 November 2019 в 18:00
поделиться

...

>> Time.at(Time.now.utc + Time.zone_offset('PST'))
=> Mon Jun 07 22:46:22 UTC 2010
>> Time.at(Time.now.utc + Time.zone_offset('PDT'))
=> Mon Jun 07 23:46:26 UTC 2010
>> Time.at(Time.now.utc + Time.zone_offset('CST'))
=> Tue Jun 08 00:46:32 UTC 2010

Одно замечание: сначала убедитесь, что для объекта текущего времени установлено время UTC, иначе Ruby попытается преобразовать объект Time в ваш местный часовой пояс, тем самым выбрасывая расчет. В этом случае вы всегда можете получить скорректированное время, добавив ".utc" в конец приведенных выше операторов.

11
ответ дан 28 November 2019 в 18:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: