2015-02-05 25 views
13

Sono completamente bloccato cercando di fare date scambio php API con frontend angolare.Come gestire datetime tra PHP (laravel API) e JavaScript (AngularJS)

Da PHP a JS mi sembra di averlo risolto. Dal momento che laravel gestisce le date attraverso Carbon Ho appena aggiunto \Carbon\Carbon::setToStringFormat('c'); a app.php che rende date escono in ISO 8601.

PHP esempio:

2015-02-04T00: 53: 51 + 02: 00

Anche il filtro di data AngularJS sembra comprendere bene questo formato e legge correttamente anche il fuso orario.

Quello che ho ancora ottenere lavoro sta postando JS data oggetti torna a PHP api.

JS esempio:

2015-02-05T13: 00: 00.000Z

JavaScript formato della data finisce con millisecondi aggiunti alla stringa e in Carbon configurazione di default si lamenta finale dei dati.

anche i browser sembrano tradurre automaticamente le mie date in ora UTC.

utilizzando manualmente new Carbon('jsDateString') sembra funzionare in un primo momento, ma su una più stretta dei dati fuso orario di ispezione non è considerato.

Quindi la mia domanda è: quale sarebbe la soluzione migliore e più automatica per inviare risale al laravel php API da AngularJS frontend?

+0

Javascript non ha il supporto nativo per i fusi orari, il che rende la gestione delle date un po 'fastidiosa a volte. Puoi dare un'occhiata a http://momentjs.com/ che è davvero una buona libreria di manipolazione del tempo. Questo articolo (https://nulogy.com/articles/dealing-with-timezones-in-javascript#.VNNrpjbN-fY) descrive anche i problemi e come sono stati risolti. In bocca al lupo! –

+0

Dal momento che sto usando il framework GUI per front-end LumX, penso che i momenti siano già intrecciati.Il fuso orario non sarebbe nemmeno importante se sospetto che il browser non converta automaticamente i miei orari in UTC. Grazie per l'articolo. Lavorerò su di esso e riferirò. – Priit

+0

@JoelHinz grazie per il collegamento. Ha un'ottima spiegazione del problema e un buon ragionamento su come risolverlo. Ma dal momento che in realtà non sono interessato ai fusi orari ma sono costretto a gestirli solo perché da qualche parte lungo la strada data inserita nel browser finisce in UTC, cercherò la soluzione più semplice (datetime) .format(). – Priit

risposta

16
$dt = Carbon::now(); 
echo $dt->toW3cString();  // 2015-02-05T14:50:55+01:00 

in quanto il carbonio può stamparlo può anche analizzare questo formato

Carbon::parse('2015-02-05T14:50:55+01:00'); 

in javascript con moment.js momentjs.com

moment().format(); // 2015-02-05T14:50:55+01:00 
+0

Non posso credere 'correctTime = moment (utcTime) .format();' era tutto ciò di cui avevo bisogno per riportare la stringa nel fuso orario corretto. Grazie @micha per la risposta. Bene, questo è stato un giorno ben speso. – Priit

+2

Come un avvertimento questo ha ancora bisogno di attributo setter per eloquente recogize pienamente il formato in quanto il modo in cui è stato istituito per gestire le date in arrivo non include questa come opzione 'funzione setStartsAtAttribute pubblica ($ value) { \t $ this-> attributes ['starts_at'] = Carbon :: parse ($ valore); } [collegamento] (https://github.com/laravel/framework/blob/5.0/src/Illuminate/Database/Eloquent/Model.php#L2822-L2859) – Priit

0

1) fare una data Carbon controller laravel

$date_from = Carbon::now(); 
return view('reports', compact('date_from')); 

2) È necessario init data data conctoller angolare

rrApp.controller('reportsCtrl', ['$scope', '$filter', function($scope, $filter) 
{ 
     $scope.start_date = new Date("{{$date_from}}"); 
     $scope.start_date = new Date($filter("date")($scope.start_date, 'yyyy-MM-dd'));// only date, no time 

}]); 

3) lo usano

<input type="date" class="form-control" ng-model="start_date"> 

4) NON cercare di init variabile in ng-init, che non avrebbe funzionato: