2015-12-02 16 views
14

Ich benutze datetimepicker.js und seine date Funktion gibt ein moment.js Objekt zurück. Es tut dies mit dem lokalen UTC-Offset darin und mein ursprüngliches Datum hat einen anderen Offset.Entferne Zeitzone von einem moment.js Objekt

Meine ursprüngliche Datum:

2015-10-01T15:00:00.000Z 

Was ich an dem Tag Zeit Picker anzuzeigen (DD-MM HH:mm):

01-10 15:00 

Was erhalte ich:

2015-10-01T15:40:00+01:00 

Was ich will:

2015-10-01T15:40:00+00:00 

Beachten Sie, wie ich den Offset +01 am Ende entfernt habe.

Wie kann ich dies für eine lokale UTC anwenden? Dies ist, ohne das 01 manuell entfernen zu müssen (da es ein anderer lokaler Offset sein kann, abhängig vom Benutzerstandort).

var momentDate = timePicker.data("DateTimePicker").date(); 
console.log(momentDate.format()); 
//this prints 2015-10-01T15:40:00+01:00 
+0

Könnten Sie bitte einen Code oder eine Geige bieten zu zeigen? Das ist ziemlich einfach mit dem Moment, aber ich habe keine Ahnung, welche APIs Sie in diesem datetimepicker-Steuerelement verwenden. –

Antwort

14

Es klingt wie Sie versuchen, den Benutzer eine UTC-basierte Datum und Uhrzeit auswählen zu lassen. Der beste Weg wäre also, den Picker im UTC-Modus arbeiten zu lassen, wenn er den Moment für den Anfang schafft. Ich bin mit diesem Datetime nicht vertraut, aber irgendwo intern vorausgesetzt, es ist so etwas wie diese:

var m = moment([year, month-1, day, hour, minute]); 

Dann sollte stattdessen tun:

var m = moment.utc([year, month-1, day, hour, minute]); 

(Die Variablen hier gezeigten kommen würden aus der Picker-Steuerung heraus.)

Idealerweise sollte die Picker-Steuerung eine Funktion zur Einstellung des UTC-Modus enthalten, damit diese intern ausgeführt werden kann, wenn Sie von Ihnen dazu aufgefordert werden.

Wenn es eine solche Funktion nicht hat, können Sie sich immer noch kompensieren. Leider können Sie nicht einfach .utc() anrufen, da dies eine andere Zeit geben würde als die, die der Benutzer gewählt hat. Sie müssen also kompensieren, indem Sie die UTC-Zeit um den Offset des ursprünglichen Moments verschieben.

var m = // moment value from the picker 
var result = moment(m).utc().add(m.utcOffset(), 'm'); 

Sie können dann format anrufen oder was auch immer Sie wollen auf das Ergebnis. Beachten Sie, dass der ursprüngliche Moment geklont mit moment(m) ist, so dass der Offset nicht verloren geht und der Wechsel zu UTC das interne Verhalten des Pickers nicht beeinträchtigt.

Beachten Sie auch, dass shifting wie dies ist in der Regel ein Hack, und wenn Sie falsch gemacht kann zu Fehlern führen. Hier ist es in Ordnung, denn der Moment ist bereits im UTC-Modus, wenn die Anpassung angewendet wird. Aber als allgemeine Lösung sollte eine Verlagerung vermieden werden. Die beste Option besteht darin, das Steuerelement zunächst in den UTC-Modus zu versetzen.

+0

Für mich funktionierte es nur, wenn ich 'var result = moment (m) .add (m.utcOffset(), 'm') benutzte. Utc();'. Wenn utc() vor dem Hinzufügen steht, gibt utcOffset nichts aus. – TheFullResolution

+0

@TheFullResolution - Ich glaube, du hast 'm.utc(). Add ...' anstelle von 'moment (m) .utc(). .' –

+0

Sie sind richtig, mein Fehler – TheFullResolution

12

Sie müssen das Format explizit angeben.

Versuchen Sie folgendes:

momentDate.format('YYYY-MM-DDTHH:mm:ss') 

dies das Ergebnis geben als

2015-10-01T15: 40: 00

Verwandte Themen