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'
Versuchen Sie, 'Time.zone.now' zu verwenden, da die reguläre stdlib-Zeitklasse nicht bewusst ist. – max
http://api.rubyonrails.org/classes/ActiveSupport/TimeWithZone.html – max
@max Ich versuchte 'my_datetime.change (Offset: ActiveSupport :: TimeZone.new ('Paris'). Formatiert_offset)' Aber das ergibt + 1 statt +2 (wegen der erwarteten Sommerzeit) –