1

Ich hatte gerade ein Problem mit einem DateTime-Feld, das mit dem falschen Zeitzonenoffset eingereicht wurde, den ich normalerweise für Leute aus dem gleichen Land beobachte (wie überraschend .... kommt von einem Internet Explorer). Ich frage mich, ob dies mit DST verbunden sein könnte, die bald Ende Oktober enden wird, und dass einige Browser Probleme damit haben könnten (obwohl die betroffene DateTime am 15. Oktober war, vor der Änderung).Rails erzwingen einen DateTime-Offset mit einem Zeitzonenparameter und DST

Das Frontend-Formular verwendete den Bootstrap datetimepicker (dessen zugrundeliegende Implementierung auf momentJS basiert). Hier ist ein kleiner Auszug aus der JS, die den Picker und das Feld aktiviert, obwohl ich nicht sicher bin, ist es relevant hier

<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> 

Um dieses Problem zu vermeiden, bitte ich den Benutzer auch eine Zeitzone vorlegen, dessen Standard ist auf die Pariser Zeitzone eingestellt.

f.time_zone_select(:time_zone) 

Wie soll ich diese Zeitzone verwenden, um die anderen Daten zu ändern, die als Parameter gesendet werden? Ich habe ein einfaches Terminformular, das zwei Datumsangaben sendet, und ich muss sie ändern, um sicherzustellen, dass ihr Offset dem time_zone Parameter entspricht (UND die Sommerzeit Extra +1, wenn es in Kraft ist).

Ich frage mich auch, ob ich dies in der Steuerung oder direkt im Modell tun sollte. Mein Controller tut die übliche Sache und mein aktuelles Modell aussieht (aber jetzt mache ich nichts mit time_zone)

class Appointment 
    include Mongoid::Document 

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

Versuchen Sie, 'Time.zone.now' zu verwenden, da die reguläre stdlib-Zeitklasse nicht bewusst ist. – max

+0

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

+0

@max Ich versuchte 'my_datetime.change (Offset: ActiveSupport :: TimeZone.new ('Paris'). Formatiert_offset)' Aber das ergibt + 1 statt +2 (wegen der erwarteten Sommerzeit) –

Antwort

0

Nun, ich this answer auf einer ähnliche Frage gefunden ... Ich bin überrascht, dass es ist kein einfacher Helfer,

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

Beachten sie, dass es immer noch nicht meine Frage beantwortet, ob ich es in dem Modell/Controller tun sollte.

Verwandte Themen