2013-12-10 3 views
0

У меня есть это приложение для рельсов, которое должно фиксировать дату и часовой пояс в одной из форм, например: Часовой пояс: 'Гонконг' как строка Дата: '31/12/2013 23:59 'как строкаМанипулирование TimeWithZone в Rails

Часовой пояс по умолчанию для приложения установлен в «Мельбурн», приложение в настоящее время принимает дату и автоматически конвертирует в «2013-12-31 23:59:00 +1100 ', что +1100 является смещением часового пояса Мельбурна с летним временем.

Я хочу, чтобы приложение к:
1) Возьми '31/12/2013 23:59:00' как время выбранного часового пояса, то есть Гонконг
2) Преобразование времени Гонконга в Мельбурн время, т.е. '31/12/2013 23:59:00 +0800 'до '01/01/2014 02:59 +1100', и сохраняются в базе данных.
3) Во время преобразования в пункте 2) необходимо обеспечить уход за летним днем.

Я написал следующий код, который будет делать именно то, что я хочу, чтобы он ТОЛЬКО работал в контроллере. Тем не менее, она не работает, когда я двигаю его к модели с before_create фильтром

time_zone = ActiveSupport::TimeZone.new(params[:time_zone]) 
date_time = DateTime.strptime(params[:date_time], '%d/%m/%Y %H:%M') 

new_date_time = date_time.change(offset: time_zone.formatted_offset(false)) 
melbourne_date_time = new_date_time.in_time_zone(Time.zone) 

Причина, по которой не работает в модели является то, что в контроллере, я вручную разобрать строку даты времени до даты времени. Но в модели рельсы автоматически преобразуют временную строку даты в объект TimeWithZone ... поэтому не могут реально изменить объект ...

Я сделал справедливое немного поиска и по-прежнему не могу разобраться точное решение.

Любая помощь будет оценена!

P.S. Приложение находится на Rails 3.2.12. Я планирую запустить преобразование в рамках метода, связанного с фильтром before_create модели.

Приветствия

+0

Как выглядит ваша модель? Что происходит, когда вы его используете? Вы не сможете получить доступ к «параметрам» контроллера непосредственно из модели. – Ari

+0

Ари, я понимаю, я не смогу получить доступ к параметрам из модели. Код выше - это прямая копия моего решения по шипу, которое я сделал в контроллере.В модели time_zone и date_time являются атрибутами моей модели, мне не нужно было извлекать ее из параметров. Проблема, с которой я столкнулась, - манипулировать объектом TimeWithZone. Мне нужно настроить часовой пояс TimwWithZone (date_time) на временной диапазон выбора пользователя, а затем использовать метод in_time_zone для преобразования в Melbourne time. – user3085562

ответ

0

Вы можете просто установить по умолчанию time_zone для приложения рельсы.

  • Открывает config/application.rb

  • TIME_ZONE набора по умолчанию с помощью этого

    class Application < Rails::Application 
    
        config.time_zone = 'Hong Kong' 
        config.active_record.default_timezone = 'Hong Kong' 
    
    end 
    
+0

Привет, Гопал, как указано в моем вопросе, по умолчанию time_zone для приложения - «Мельбурн» (config.time_zone = «Мельбурн» в config/application.rb). Пользователь может выбрать любой часовой пояс, доступный в форме «time_zone_select» в форме для моей проблемы, то есть в Гонконге, Аделаиде и т. Д. – user3085562

+0

Я доволен «Мельбурном» в качестве своего часового пояса по умолчанию. – user3085562

0

Я нашел (грязный?) Способ архивировать, что я хочу в этой модели.

вход пользователя из формы: Time Zone - 'Гонконг', как String, Дата Время - '31/12/2013 23:59:00' как строка

config.time_zone = 'Melbourne'# in config/application.rb 

self.time_zone # 'Hong Kong' as String 
self.date_time # '31/12/2013 23:59:00 +1100' as TimeWithZone 

class MyClass < ActiveRecord::Base 
    before_create :populate_date_time_with_zone 
    def populate_date_time_with_zone 
    original_tz = Time.zone # Capture the system default timezone, 'Melbourne' 
    Time.zone = self.time_zone # Change the timezone setting for this thread to 'Hong Kong' 
    dt = Time.zone.parse(self.date_time.strftime('%d/%m/%Y %I:%M%p')) #Dirty?? 
    self.date_time = dt.in_time_zone(original_tz) # '01/01/2014 02:59:00 +1100' as TimeWith Zone 
    end 
end 

Есть ли лучше способ сделать это, чем печатать время даты в строке, чем анализировать его снова с измененным Time.zone?

Смежные вопросы