Angular JS — изменение даты при отправке в $ http — проблема с часовым поясом

#javascript #angularjs #date-format #angular-ui-bootstrap #timezone-offset

#javascript #angularjs #формат даты #angular-ui-bootstrap #смещение часового пояса

Вопрос:

У меня возникла странная проблема, когда a 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, и клиентская сторона работают на локальном хосте.

В дополнение к этому:

Когда поле щелкается во второй раз и запускается указатель даты / выбирается дата, во второй раз проблема не появляется:

Console.log:

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

Получены данные скрипача:

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

Комментарии:

1. Я передаю правильно отформатированную строку даты, подобную этой, в $ http. возврат службу $http.пост(‘АПИ/должностей/по расписанию’, данные); и правильный формат даты строки Здесь…данных.дата 2016-04-22 15:в 15:00 GMT 0100 (по британскому летнему времени) в хроме в сети осмотра я вижу, размещенной дата преобразуется в это:2016-04-22T14:15:00.000 Z и — как вы можете видеть на HTTP сделала timezone для нас, но это действительно ненужные на данном этапе. Если вы затем извлекаете это сохраненное значение позже, вы не будете знать, было ли это сделано в BST или нет, и не сможете выполнить обратное вычисление. ……… по британскому летнему времени. Вводится правильный формат, но вывод изменен:(

Ответ №1:

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

.

Проблема:

В настоящее время ваше местное время по британскому летнему времени эквивалентно GMT 1

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

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

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

.

Разрешение

Вам необходимо принудительно форматировать дату в соответствии с вашим языком.

  • Угловой шаблон
     {{ 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>
     

Комментарии:

1. да … используйте фильтр даты или шаблон даты docs.angularjs.org/api/ng/filter/date

2. Я думаю, вы также могли бы использовать сценарий файла локали в вашем `<head><script src=»angular-locale_en-uk.js «></script>…

3. Большое спасибо, похоже, это работает: StartDate = $filter('date')(StartDate, 'medium');

4. Я пытаюсь разработать приложение, которое может работать по всему миру, поэтому, я думаю, требуется еще некоторое тестирование, но я думаю, что удаление даты, похоже, работает. Спасибо 🙂

5. У меня точно такая же проблема, как ОП, но я уже использую фильтры, а также попытался добавить параметр часовой пояс…так короче мой взгляд правильно и корректно отформатированы по британскому летнему времени, но http полосы зону и делает расчет час..но не по калифорнийскому времени.. Я не согласен с тем, что angular снабжены инструкциями по форматированию даты: Ср. 06 Авг. 2014 г. 22:00:00 GMT 0100 (летнее время GMT) Если я получу рабочее решение, я представлю это здесь. Я не использую файл angular -locale, поэтому попробую это дальше, но я не думаю, что это проблема после просмотра содержимого