2015-12-02 21 views
14

Sto utilizzando datetimepicker.js e la sua funzione date restituisce un oggetto moment.js. Lo fa con l'offset UTC locale in esso e la mia data originale ha un offset diverso.Rimuovi fuso orario da un oggetto moment.js

mia data originale:

2015-10-01T15:00:00.000Z 

Cosa visualizzo sul tempo di selezione data (DD-MM HH:mm):

01-10 15:00 

Cosa ottengo:

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

quello che voglio:

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

Nota come ho rimosso l'offset +01 alla fine.

Come posso fare questo applicandolo per qualsiasi UTC locale? Questo è, senza dover rimuovere manualmente il 01 (come può essere un qualsiasi altro offset locale a seconda della posizione dell'utente).

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

La prego di fornire qualche codice o un violino per dimostrare? Questo è abbastanza facile con il momento, ma non ho idea di quali API stai usando in questo controllo datetimepicker. –

risposta

14

Sembra che si stia tentando di consentire all'utente di scegliere una data e un'ora basate su UTC. Pertanto, il modo migliore sarebbe quello di far funzionare il raccoglitore in modalità UTC quando crea il momento per iniziare. Non ho familiarità con questo particolare datetimepicker, ma assumendo da qualche parte internamente lo fa qualcosa di simile:

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

Poi si dovrebbe invece fare questo:

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

(Le variabili riportate qui sarebbe venuta dall'interno del controllo di selezione.)

Idealmente, il controllo di selezione deve includere una funzione per impostare la modalità UTC in modo che possa eseguire questa operazione internamente, quando viene indicata da voi.

Se non dispone di tale funzione, è ancora possibile compensare. Sfortunatamente, non puoi chiamare semplicemente .utc(), dato che darebbe un tempo diverso da quello scelto dall'utente. Quindi, dovrai compensare spostando l'ora UTC dall'offset del momento originale.

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

È quindi possibile chiamare format o quello che volete sul risultato. Si noti che il momento originale è clonato con moment(m), in modo tale che l'offset non vada perso e il passaggio a UTC non interferisca con il comportamento interno del raccoglitore.

Inoltre, notare che lo spostamento di come questo è generalmente un trucco, e se fatto male può portare a errori. Qui va bene, perché il momento è già in modalità UTC quando viene applicata la regolazione. Ma come soluzione generale, lo spostamento dovrebbe essere evitato. L'opzione migliore è avere il controllo inserito nella modalità UTC per cominciare.

+0

Per me ha funzionato solo se ho usato 'var result = moment (m) .add (m.utcOffset(), 'm'). Utc();'. Se utc() è prima di aggiungere, utcOffset non produce nulla – TheFullResolution

+0

@TheFullResolution - Penso che forse hai fatto 'm.utc(). Add ...' invece di 'momento (m) .utc(). Aggiungi .. .' –

+0

hai ragione, mio ​​errore – TheFullResolution

12

È necessario specificare esplicitamente il formato.

Prova questo:

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

questo darà il risultato come

2015-10-01T15: 40: 00