2016-03-01 37 views
7

Io uso il DatePicker per scegliere la data e inviarlo al server.data di sbagliato con la data del materiale angolare picker

Quando annoto il valore JS ottengo il risultato corretto:

Tue Mar 22 2016 00:00:00 GMT+0100 (Mitteleuropäische Zeit) 

ma nella richiesta Ajax si è

2016-03-21T23:00:00.000Z 

Non modificare i valori, solo dando l'oggetto da funzione http di angolari.

non angolare bisogno di qualche configurazione per gestire la cosa?

+0

Ho trovato l'aggiunta di ng-model-options = "{timezone: 'utc'}" a md-date-picker per essere una buona soluzione. – Brendan

risposta

3

Quei due stringhe rappresentano allo stesso tempo. Uno è in UTC, cioè GMT +0, che puoi vedere dal termine Z. L'altro è in un fuso orario diverso, in particolare GMT +1 ora.

Se trovassi oggetti JavaScript Date per entrambe le stringhe, e li ha trasformati in numeri interi, cioè secondi trascorsi dal 1 gennaio 1970, UTC, che si può trovare loro identici. Essi rappresentano la stessa istante ma in due diverse località geografiche .

var d1 = new Date('Tue Mar 22 2016 00:00:00 GMT+0100'); 
var d2 = new Date('2016-03-21T23:00:00.000Z'); 

Number(d1); // 1458601200000 
Number(d2); // 1458601200000 

Generalmente questa è una buona cosa. Trattare in fusi orari diventa molto confuso. Trovo che sia meglio per un server gestire sempre in UTC.

+0

Ma come posso inviare il formato gmt + 1 al server? – mimo

+1

Consiglio vivamente di non provare. Il server può memorizzare UTC, quindi può inviare UTC al browser. Javascript può costruire un oggetto 'Date' dall'ora UTC, e per impostazione predefinita mostrerà all'utente un fuso orario localizzato senza che tu debba fare nulla. Se davvero _ devi memorizzare quello specifico del fuso orario sul server, puoi forzare il valore a essere una stringa prima di inviarlo chiamando il suo metodo '.toString()'. – Chris

3

https://github.com/angular/material/pull/9410

controllare la versione 1.1.1+. Questo risolverà il tuo problema.

<md-datepicker ng-model="date" ng-model-options="{ timezone: 'utc' }"></md-datepicker> 
+0

Voglio eseguire lo stesso in angular 2 (+) e mat-datepicker, Qualche soluzione? Grazie in anticipo!! –

2

si può provare il seguente pezzo di codice

date.setMinutes((date.getTimezoneOffset() * -1)); 

Non c'è bisogno di localizzazione, utilizzare questo codice appena prima di effettuare qualsiasi chiamata di servizio. Ti passerà la data esatta di ciò che hai selezionato nel datepicker.

che possa funzionare in ciascuno fuso orario (+) e (-),

Esempio: 2016-03-21 00:00:00 GMT+0100, il suddetto codice occulta come 2016-03-21 01:00:00 GMT+0000. Mentre è in servizio, lo converte come 2016-03-21 00:00:00.

penso che risolverà il vostro problema.

Problemi correlati