Angular JS - Изменения даты при отправке в $http - Timezone issue

У меня возникла странная проблема, когда параметр Date изменяется, когда он передается API через $http.put, я подозреваю, что проблема с часовым поясом:

Datepicker запускает событие ng-change - console.log:

Tue Jun 10 2014 00:00:00 GMT+0100 (GMT Summer Time)

Передано в API с помощью Angular $http.put...

Когда он нажимает Fiddler:

StartDate=2014-06-09T23:00:00.000Z

Как видите, дата меняется с 10 июня по 9 июня.

Как я могу остановить это изменение даты? Это часовой пояс, вызвавший изменение? И API, и клиентская сторона работают на Localhost.

Далее:

При повторном нажатии этого поля и выборе даты/даты datepicker этот второй раз проблема не появляется:

console.log:

Wed Aug 06 2014 22:00:00 GMT+0100 (GMT Summer Time)

Полученные данные Fiddler:

StartDate=2014-08-06T21:00:00.000Z

Ответы

Ответ 1

Я думаю, что это вопрос TZ, b/c разница между вашим GMT+0100 и вашим StartDate=2014-06-09T23:00:00.000Z составляет 5 часов.

.

Проблема:

Ваше местное время в настоящее время BST (британское летнее время) эквивалентно GMT +1

Это будет время по умолчанию, когда вы вызываете свой вызов API.

Однако API был написан Google в Калифорнии, и они довольно эгоцентричны. Поэтому они автоматически преобразуют время, так как вы не предоставляете никаких инструкций форматирования date.

Другими словами, Chrome делает конверсию для вас красиво, когда вы печатаете на console.log(), но когда вы делаете свой $http.put, Angular, без явного форматирования для вас, делает вызов с использованием его по умолчанию TZ (который равен PST)

.

Разрешение

Вам нужно форматировать форматирование даты в вашей локали.

  • Angular шаблон

    {{ date_expression | date : 'yyyy-MM-dd HH:mm:ss'}}
    
  • В JavaScript

    $filter('date')(date, 'yyyy-MM-dd HH:mm:ss')
    
  • с использованием локализации

    <html>
      <head>
        <title>My Angular page</title>
        <script src="angular-locale_en-uk.js"></script>
        ...
      </head>
      <body>
        ...
      </body>
    </html>