2015-02-05 6 views
13

Utknąłem, próbując zrobić daty wymiany php api z kątowym frontendem.Jak obsługiwać datetime między php (Laravel api) i javascript (AngularJS)

Od PHP do JS wydaje się, że posortowane. Od laravel uchwyty dat przez Carbon Właśnie dodałem \Carbon\Carbon::setToStringFormat('c'); do app.php co sprawia, że ​​terminy wyjdzie w normie ISO 8601.

przykład PHP:

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

Filtr daty AngularJS również wydaje się dobrze rozumieć ten format, a nawet poprawnie odczytuje okno czasowe.

To, co muszę jeszcze zrobić, to umieszczanie obiektów daty JS z powrotem w api PHP.

JS przykład:

2015-02-05T13: 00: 00.000Z

JavaScript format daty kończy się milisekund dodanych do łańcucha i w domyślnej konfiguracji Carbon narzeka spływu danych.

Również przeglądarki wydają się automatycznie tłumaczyć moje daty na czas UTC.

Ręczne używanie new Carbon('jsDateString') wydaje się działać, ale po dokładniejszym sprawdzeniu dane strefy czasowej nie są uwzględniane.

Moje pytanie brzmi: jakie byłoby najlepsze i najbardziej automatyczne rozwiązanie do wysyłania dat z powrotem do Laravel php api z nakładki AngularJS?

+0

Javascript nie ma natywnego wsparcia dla stref czasowych, co sprawia, że ​​obsługa daty jest czasami bardzo denerwująca. Możesz rzucić okiem na http://momentjs.com/, która jest naprawdę dobrą biblioteką manipulacji czasem. Ten artykuł (https://nulogy.com/articles/dealing-with-timezones-in-javascript#.VNNrpjbN-fY) opisuje również problemy i sposoby ich naprawienia. Powodzenia! –

+0

Ponieważ używam LVX frontend GUI framework, myślę, że momentJs jest już zaplątany.Strefa czasowa nie byłaby nawet ważna, jeśli podejrzewam, że przeglądarka nie dokonałaby automatycznie konwersji moich czasów na UTC. Dzięki za artykuł. Przejdę przez to i zgłoś się. – Priit

+0

@JoelHinz dzięki za link. Ma bardzo dobre wytłumaczenie problemu i dobre uzasadnienie, jak go rozwiązać. Ale ponieważ w rzeczywistości nie interesuję się strefami czasowymi, ale jestem zmuszony radzić sobie z nimi tylko dlatego, że gdzieś po drodze wpisana w przeglądarce data kończy się w UTC, zajrzę do prostszego rozwiązania (datetime) .format(). – Priit

Odpowiedz

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

ponieważ węgiel może go wydrukować może również analizować tego formatu

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

w javascript z moment.js momentjs.com

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

Nie mogę uwierzyć, że 'correctTime = moment (utcTime) .format();' było wszystkim, czego potrzebowałem, aby przywrócić łańcuch do właściwej strefy czasowej. Dziękuję @micha za odpowiedź. To był dobrze spędzony dzień. – Priit

+2

Jako zastrzeżenie to nadal potrzebuje atrybutu setter dla wymowny w pełni recogize formatu, ponieważ sposób, w jaki został utworzony w celu obsługi dat przychodzące nie obejmuje to jako opcja 'publicznego setStartsAtAttribute function ($ value) { \t $ this-> attributes ['starts_at'] = Carbon :: pars (wartość $); } ' [link] (https://github.com/laravel/framework/blob/5.0/src/Illuminate/Database/Eloquent/Model.php#L2822-L2859) – Priit

0

1) datę dokonania węgla w kontrolerze laravel

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

2) Musisz init data w Kątowymi conctoller

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) używać

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

4) nie próbuj init zmienną w NG-init nie będzie działać:

Powiązane problemy