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.