2017-02-05 4 views
0

Wenn Rails eine Zeitspalte speichert, konvertiert es meine Zeitzone in UTC. Wenn ich den Datensatz aus der Datenbank holen will, kommt er immer mit 2000-01-01 zurück. Wenn also die Zeitzonenumwandlung auf den nächsten Tag gerollt wird, verursacht das Probleme.Wie verhindert man, dass Rails das Datum einer Zeitspalte bei der Konvertierung in UTC in Unordnung bringt?

Beispiel (Rails Version 3.2.8):

Hier ist eine vereinfachte Version meiner ReservableTime Modell.

> ReservableTime 
=> ReservableTime(id: integer, start_at: time, end_at: time) 

Also, ich mache eine, die um 3:00 Uhr beginnt und endet um 4:30 Uhr:

> ReservableTime.create({start_at: Time.parse("3:00pm"), end_at: Time.parse("4:00pm")}) 
=> #<ReservableTime id: 1446, start_at: "2017-02-05 23:00:00", end_at: "2017-02-06 00:30:00"> 

Rails die Zeiten UTC von meiner Zeitzone umgewandelt (GMT-08: 00). Wie Sie sehen können, rollte die end_at Spalte auf den nächsten Tag über. Wäre schön, wenn diese Spalte ein Datum waren, aber wenn ich den Rekord zurückzuholen ...

> reservable_time = ReservableTime.find 1446 
=> #<ReservableTime id: 1446, start_at: "2000-01-01 23:00:00", end_at: "2000-01-01 00:30:00"> 

Die Zeiten kommen zurück mit dem gleichen Standarddatum (2000-01-01) so meine end_at vor Liquidation meine start_at!

Also, wenn ich wissen will, ob etwas zwischen meinen beiden Zeiten fällt, werde ich, dass nichts finden ...

> Time.parse("4:00pm").between?(reservable_time.start_at, reservable_time.end_at) 
=> false 

Grrr ... Und nur sicherstellen, dass ich bin nicht verrückt:

Was kann getan werden?

+1

Wie würdest du eine Zeit darstellen, die um 23 Uhr beginnt und um 2 Uhr am nächsten Tag mit deinem aktuellen Design endet? Ich denke du musst den Anfang und das Ende als DateTime speichern – usha

+0

@Vimsha Ich verstehe was du meinst. Ich werde nie Zeiten brauchen, um von einem Tag zum anderen zu gehen, also hatte ich nicht daran gedacht. Wenn ich die Zeiten als DateTime speichere, dann fügt es überall eine Ebene hinzu, um das Datum loszuwerden ... –

+0

http://stackoverflow.com/questions/12832857/date-reverts-to-2000-01-01-from-activerecord -to-mysql und http://stackoverflow.com/questions/1966627/why-does-rails-always-display-a-datetime-as-1-1-2000-with-the-correct-time – emaillenin

Antwort

0

Danke für die Kommentare, alle. Super hilfreich. Ich entschied mich, mit DateTime zu gehen.

Was ich gelernt habe: Wenn es notwendig ist, den Unterschied zwischen zwei Mal zu vergleichen, oder festzustellen, ob etwas zwischen zwei Mal fällt, Time wird nicht funktionieren, und DateTime sollte verwendet werden.

Es fühlt sich an wie eine Verschwendung, wenn Sie den Datumsteil nicht benötigen, aber die Wahrheit ist, dass der Datumsteil benötigt wird, um die Zeitzonenumwandlung davon abzuhalten, die Beziehung zwischen zwei Zeiten zu zerstören.

Verwandte Themen