1

У меня просто возникла проблема с полем DateTime, которое было отправлено с неправильным смещением часового пояса, которое я обычно наблюдаю для людей, отправляющих из одной страны (насколько удивительно .... приходящее из Internet Explorer). Мне интересно, может ли это быть связано с DST, которое скоро закончится в конце октября, и что у некоторых браузеров могут быть проблемы с этим (хотя затронутое DateTime было около 15 октября, до изменения).Rails обеспечивает смещение DateTime с параметром часового пояса и DST

В интерфейсной форме использовался bootstrap datetimepicker (основная реализация которого зависит от момента jS). Вот небольшой отрывок из JS, который активирует сборщик и поле, хотя я не уверен, что это отношение здесь

<div class="col-xs-4" id="appointment-time-start"> 
    <%= f.hidden_field :from %> 
</div> 
<script> 
$('#appointment-time-start').datetimepicker({ 
     format: 'LT', 
     defaultDate: "<%= model.from || (Time.now + 2.days) %>", 
    }); 
</script> 

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

f.time_zone_select(:time_zone) 

Как использовать этот часовой пояс для изменения других дат, которые отправляются как параметры? У меня есть простая форма для отправки, которая отправляет два времени, и мне нужно их модифицировать, чтобы их смещение соответствовало параметру time_zone (И время перехода на летнее время дополнительно +1, если оно действует).

Мне также интересно, должен ли я делать это в контроллере или непосредственно в модели. Мой контроллер делает обычную вещь, и моя нынешняя модель выглядит (но сейчас я ничего с time_zone не делает)

class Appointment 
    include Mongoid::Document 

    field :from, type: DateTime 
    field :to, type: DateTime 
    field :time_zone, default: 'Paris' 
+0

Попробуйте использовать 'Time.zone.now' как обычный stdlib. Класс времени не знает tz. – max

+0

http://api.rubyonrails.org/classes/ActiveSupport/TimeWithZone.html – max

+0

@max Я попробовал 'my_datetime.change (offset: ActiveSupport :: TimeZone.new ('Paris'). Formatted_offset)' Но это дает + 1 вместо +2 (из-за ожидаемого DST) –

ответ

0

Ну я нашел this answer на подобный вопрос ... Я удивлен, что там не более простой помощник, который делает это Oo

def set_in_timezone(time, zone) 
    Time.use_zone(zone) { time.to_datetime.change(offset: Time.zone.now.strftime("%z")) } 
end 

Обратите внимание, что она по-прежнему не отвечает на мой вопрос о том, должен ли я сделать это в модели/контроллера.

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