2015-05-14 17 views
7

Sto utilizzando la selezione di date HTML5. Dopo aver scelto la data, il modello ng mostra la data precedente piuttosto che la data corrente selezionata.Problema di data in angolare

<input type="date" ng-model="dateModel" /> 

quando scelgo data corrente ng-modello ha 2015-05-13T18: 30: 00.000Z invece di 2015/05/14. Se uso in jQuery, esso immagazzina correttamente come 2015-05-14

Come posso risolvere questo?

Plunker - AngularJS

Plunker - jQuery

risposta

5

Questa è la data corretta per la versione angolare, tuttavia la data è formattato per UTC che potrebbe sembrare sbagliato se non si è pienamente consapevole di questo.

Il fuso orario è sempre uguale a zero UTC, come indicato dal suffisso "Z".

UTC Source

sguardo nel angolare date filters. Ci sono molte opzioni fuori dalla scatola e praticamente qualsiasi formato desideri sia ottenuto - ma soprattutto, risolto nel tuo fuso orario. Per esempio ...

{{dateModel | date:'shortDate'}} // -- prints 5/14/15 
{{dateModel | date:'yyyy-MM-dd'}} // -- prints 2015-05-14 

Plunker Link


più su fornendo esplicitamente una paramater timezone e fiducioso il browser per risolvere il nostro tempo (docs angolari)

{{ date_expression | date : format : timezone }} // -- template binding 
$filter('date')(date, format, timezone)   // -- javascript 

fuso orario per essere utilizzato per la formattazione. Comprende le sigle UTC/GMT e le sigle continentali degli Stati Uniti , ma per uso generale usa uno scostamento del fuso orario , ad esempio '+0430' (4 ore, 30 minuti ad est di il meridiano di Greenwich) Se non specificato, verrà utilizzato il fuso orario del browser .


Se la vostra preferenza è quello di definire in modo esplicito un fuso orario con ngModelOptions piuttosto che sfruttando filtri, è possibile farlo con il seguente

<input type="date" 
    ng-model="dateModel" 
    ng-model-options="{timezone: timezone}" /> 


var date = new Date() 
$scope.timezone = ((date.getTimezoneOffset()/60) * -100) // e.g. -400 EDT 

Vedi this answer che spiega la logica dietro il calcolo manuale

Plunker Link - con ng-model-options

+0

non lo faccio vuoi usare un filtro piuttosto usare le opzioni del modello ng – user1184100

+0

@ user1184100 Qualche ragione per cui? Solo curioso. In ogni caso, la risposta aggiornata per voi che include questo filtro – scniro

+1

viene utilizzata solo per il display, ma i dati in ng-model vengono salvati in db, quindi questa è la ragione per cui preferirei opzioni di modello ng – user1184100

1

AngularJS imposta il modello al UTC data-ora.Credo che questo sia il problema è necessario verificare: http://github.com/angular/angular.js/issues/8447

Così per il mio fuso orario, se ho impostato ng-model-options="{timezone: '-0200'}" sull'ingresso ottengo lo stesso data-ora come la versione di jQuery: http://plnkr.co/edit/Qesmucv4aU5Yqu9sxbtp?p=preview

+0

Ho fatto $ scope.timezone = d.getTimezoneOffset(); e ha cambiato il codice html in è tutto ciò che devo fare? – user1184100

+1

Dovresti dividere 'd.getTimezoneOffset()' di 60, perché restituisce l'offset in minuti e ne hai bisogno in ore. Questo funziona per me: http://plnkr.co/edit/Qesmucv4aU5Yqu9sxbtp?p=preview –

0
{{dateModel | date : 'yyyy-MM-dd'}} 
// {{ date_expression | date : format : timezone}} 
Problemi correlati