Angular $http.post изменение даты на дату UTC

Я пытался отправить некоторые данные в мой REST api, у которого есть дата. Теперь, когда я отлаживаю, мой параметр даты - это объект JS Date с правильной датой в моем часовом поясе: Tue Apr 04 2017 00:00:00 GMT+0530

после того, как он покидает мой код, и я вижу то же самое на вкладке сети, он преобразуется в дату UTC: "2017-04-03T18:30:00.000Z"

Я искал решение, в соответствии с которым мне нужно включить файл locale из angular в мой index.html, который я сделал:

<script type="text/javascript" src="resources/js/angular/angular-locale_en-in.js"></script>

но это не помогает. Я видел решения, такие как добавление формата даты для фильтрации или что-то еще, но я хочу глобальное решение. Любая помощь? Спасибо:)

Ответы

Ответ 1

Обработка даты, времени и часового пояса тоже смутила меня. Может быть, этот ответ дает вам некоторое представление о том, как вы с ними справитесь.

Попробуйте использовать следующий код в консоли разработчика Chrome и посмотрите, как такая же дата представлена ​​в разных форматах:

var date = new Date();
date.toISOString(); // "2017-04-29T09:54:28.714Z"
date.toGMTString(); //"Sat, 29 Apr 2017 09:54:28 GMT"
date.toLocalString(); //"4/29/2017, 3:24:28 PM"

Любая дата, которую вы создаете на клиенте, всегда записывает дату при нулевом смещении часового пояса, т.е. UTC+/-00:00 Z. Для простоты вы можете думать, что UTC и GMT такие же. Когда дело доходит до цели показа, та же самая дата отображается в соответствии с часовым поясом браузера. Если вы выполните console.log (date), он выведет Sat Apr 29 2017 15:24:28 GMT+0530 (IST), но это не означает, что внутренняя запись даты соответствует часовому поясу браузера. Он просто отображается на экране/консоли в соответствии с часовым поясом браузера.

Посмотрите на представления даты, которые не преобразуются из одного часового пояса в другой, но рассматривают их как другое представление той же даты. В вашем браузере он представлен как смещение GMT+0530, и когда он отправляется на сервер, он имеет ту же дату при нулевом смещении временной зоны.

В соответствии с вашим комментарием, если вы выберете 4 апреля в 00:00 часов по часовой стрелке GMT ​​+ 0530, внутренне это будет 3 апреля в 18:30 в GMT + 0, то есть нулевое смещение временной зоны. Пусть он перейдет на сервер, как есть. Когда вам нужно использовать эту дату, она возвращается с сервера как 3 апреля, и она будет отображаться в браузере в соответствии с смещением часового пояса браузера. Нет никакого преобразования, это одна дата с различным представлением.

Я как-то задал вопрос , возможно, это добавляет больше разъяснений.

И вообще, этот ответ все тот же, что и ответы @geminiousgoel и @charlietfl.

Ответ 2

Передача даты UTC серверу - это желаемое поведение. Клиентские API должны обрабатывать время UTC, а не предполагать, что даты - это все локальные даты.

Но в любом случае вы можете преобразовать дату в строку на основе локального часового пояса и передать строку на сервер.

Ответ 3

Как и в случае с charlietfl, вероятно, глобальный взлом должен был бы переопределить метод Date.prototype.toJSON(), но это не очень хорошая практика.

Где вы используете свой вызов $http.post? Лучшее место для отправки запроса $http будет в сервисе. Если вы используете услугу, я предлагаю вам включить ваш API общедоступной службы, чтобы вы могли использовать методы "public" и "private": это могут быть утилиты для выполнения общих операций, таких как преобразования данных, проверки.

angular.service('bookStoreService', ['$http'], function($http) {
    var normalizeBooks = function(booksArray){
        booksArray.forEach(function(book){  
            // do something on the book
        });
    };

    var updateBooks = function(books){
       normalizeBooks(books);
       $http.post('myurl', books);
    };

    return {
       updateBooks : updateBooks
    };
});

Ответ 4

Сценарий:

Отправьте дату из UI в API call как epoch time (UNIX Time) вместо строки date. Вы можете использовать getTime() для преобразования даты в эпоху.

var dateStr = "Tue Apr 04 2017 00:00:00 GMT+0530";

var dateEpoch = new Date(dateStr).getTime();

console.log(dateEpoch); // 1491244200000 (Local Time)

Ответ 5

Я думаю, вы просто можете передать его как строку (если api вы используете строки принятия) с нужным вам форматом, скажем, "Tue Apr 04 2017 00:00:00 GMT + 0530" и сохраните его в фоновом режиме как string, а затем, когда вы его извлечете, это будет строка, поэтому она не будет изменена каким-либо образом.

Ответ 6

Jindal saab, он будет работать следующим образом. Когда мы выбираем любую дату с выбором даты или просто передаем любое значение, она берет исходную локальную дату, но когда мы передаем это значение дальше, она преобразует ее в UTC, после чего ей необходимо снова преобразовать в локальную зону на принимающей стороне. База данных сохраняет дату-время в формате UTC.

Ответ 7

Вы добавили в свое приложение библиотеку angular -locale_en-in.js? Что-то вроде этого....

angular.module('myAngularApp', [
    'ngLocale'])

В противном случае библиотека js не будет иметь никакого эффекта в вашем приложении angular.