2017-05-19 2 views
1

Ich bin auf etwas gestoßen, das ich für richtig hielt, aber jetzt, wo ich genauer hinsehe, ist etwas falsch.DST-Verschiebung mit Moment richtig korrigieren

Ich bin auf einem Projekt einer Pillenerinnerung App, wo jemand Benachrichtigungen setzen kann, um ihn daran zu erinnern, Pillen in der richtigen Zeit zu nehmen. Es gibt Medikamente, die eine Person für den Rest ihres Lebens einnehmen kann. Und in diesem Fall setze ich keine Warnungen für Jahre, ich setze maximal 3 Monate und, wenn er einen macht und es als erledigt markiert, setze ich einen weiteren Alarm für 3 Monate später ab diesem Datum/Zeitpunkt.

Diese App wird nur in Brasilien veröffentlicht und wir haben die Sommerzeit hier. Wenn es in die Sommerzeit umschaltet, müssen die Uhren auf -1 Stunde nach Mitternacht eingestellt werden, wenn sie aus der Sommerzeit kommt, wird sie 1 Stunde lang.

Für dieses Projekt verwende ich Firebase, Ionic 2, das LocalNotification Plugin und Moment JS.

Ich muss eine Geschichte des Benutzers machen, weil andere Benutzer sehen können, ob er es richtig nimmt, also verwende ich Moment JS, um die Datetime zu manipulieren und die Benachrichtigung zu speichern und einen Knoten für diesen Benutzer in Firebase mit UNIX-Zeit zu erstellen.

LASSEN WIR ENDLICH ZUM PROBLEM GEHEN.

Beim Speichern eines Datums überprüfe ich, ob dieses Datum DST ist, wenn ich +3 Stunden hinzufüge, wenn ich nicht +2 hinzufüge. Ich muss hinzufügen, weil, wenn ich die isoString in der Moment() Funktion wickle es gibt mir -3 Stunden oder -2 Stunden (Habe nicht nach diesem gesucht, aber ich denke, Moment nutzt USA Zeit).

Das funktioniert gut, wenn ich Daten innerhalb der DST-Zeiten speichere, wenn ich in der Sommerzeit bin, wenn ich nicht auf Sommerzeit bin und eine Benachrichtigung für einen Sommerzeit-Tag mit +2 Stunden speichern.

EIN BEISPIEL

Die DST Zeit in DST am 15. Oktober verschieben Wenn ich 30 Meldungen speichern müssen, eine pro Tag jeden Tag als 00.00, am 1. Oktober beginnen bis 30. Oktober von Tag 1 bis zum 15. Tag werden die Daten stimmen, von Tag 16 bis 30 werden sie mit +2 Stunden sein.

Hier ist der grundlegende Code verwende ich:

// THIS'LL SET MY DATEPICKER TO THE DATE/HOUR I'M IN. 
minDate: any = Moment().isDST ? Moment().subtract(3, 'h').toDate().toISOString() : Moment().subtract(2, 'h').toDate().toISOString(); 

// THIS'LL CONVERT THE SELECTED DATE TO A UNIX TIME IN WICH I'LL USE TO SAVE THE NOTIFICATION AND THE MEDICATION DATA ON FIREBASE 
unixConverted = Moment(this.minDate).isDST ? Moment(this.minDate).add(3, 'h').unix() : Moment(this.minDate).add(2, 'h').unix(); 

Was seltsam ist, dass Moment().unix() mit allein es gibt mir die richtige Zeit, in der ich bin, wenn ich Moment(this.minDate).unix() verwenden es gibt mir -2 oder -3 Stunden der Stunde, die ich ausgewählt habe.

Also, wenn es in DST (in welche ich meine Uhr auf -1 Stunde eingestellt haben) i hinzufügen 3, wenn nicht i 2. Fügen Sie

  • Wie ist der richtige Weg, um diese DST Verschiebung zu manipulieren ?
  • Gibt es eine bessere Möglichkeit als DST zu verwenden?
  • Bin ich richtig mit dieser Logik oder ist das viel komplexer als was ich denke?

Jede Hilfe, Ideen oder Anleitung sind willkommen. Wenn mehr Details benötigt werden, fragen Sie einfach

Antwort

0

Ok, also habe ich einen besseren Weg gefunden, ohne .isDST() Methode zu verwenden.

Einfache Verwendung Moment().add(Moment().utcOffset(), 'm'), dies wird die aktuelle Zeit und den Offset in Minuten hinzufügen.

Die Methoden .add() und .subract() lassen Moment die UTC-Zeit zurückgeben.

Die utcOffset() gibt eine positive oder negative Anzahl von Minuten (Stunden) von UTC, wie -60 oder 180 zurück. So werde ich die richtige Zeitverschiebung erhalten.

Arbeitete wie ein Charme für mich.