Почему переданная дата из внешнего интерфейса не совпадает с датой в бэкэнде (Java) в мс - PullRequest
1 голос
/ 02 июля 2019

Я разрабатываю приложение с AngularJS во внешнем интерфейсе и Java (с Spring) во внутреннем интерфейсе.
Я заметил, что отображаемые даты объекта profile во внешнем интерфейсе не такие, как вбаза данных.
Итак, я отладил момент сохранения даты и обнаружил, что во внешнем интерфейсе (справа при сохранении даты - $scope.selectedProfile.$save) дата имеет следующее значение:

$scope.selectedProfile.projects[1].start -> Date: 2017-10-31T23:00:00.000Z
$scope.selectedProfile.projects[1].start.getTime() -> 1509490800000

Затем я прихожу к точке останова в бэкэнде в строке возврата:

@RestController
@RequestMapping(value = "/profiles", produces = MediaType.APPLICATION_JSON_VALUE)
public class ProfileController {

  @RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
  public Profile update(@RequestBody Profile profile) {
      return this.repository.save(profile);
  }

}

И дата имеет следующее значение:

profile.projects.get(1).start -> (Date) “Tue Oct 31 23:00:00 CET 2017”
profile.projects.get(1).start.getTime() -> 1509487200000

Не возникает ли проблема здесь уже?- потому что функции "getTime ()" не должны возвращать одно и то же число как во внешнем, так и во внутреннем интерфейсе, поскольку они не зависят от часовых поясов?

Проблема заключается в том, что я экспортирую значения в файл Word и отображаюмесяц, в котором написано «октябрь», хотя дата, отображаемая в веб-интерфейсе, - 1 ноября.

У кого-нибудь есть идеи, что я могу сделать?

Вот JSON, который передается:

{
  "id": 64,
  "projects": [
    {
      "id": 135,
      "project": 339,
      "start": null,
      "end": null
    },
    {
      "id": 132,
      "project": 403,
      "start": "2017-10-31T23:00:00.000Z",
      "end": null
    }
  ]
}

Данные передаются через этот код:

$http.post('/profiles/profiles', profile)

Отображение выполняется автоматически весной, я думаю.

1 Ответ

2 голосов
/ 02 июля 2019

Я думаю, что вы неправильно понимаете, как даты (как в JavaScript, так и в Java) зависят от часовых поясов, и я думаю, что, возможно, что-то не так с тем, как анализируется входящая дата на стороне Java.

На клиенте (на стороне JavaScript) ваша (отформатированная) дата - «2017-10-31T23: 00: 00.000Z», а на серверной стороне (на стороне Java) ваша (отформатированная) дата - вт 31 октября 23: 00: 00 CET 2017 '.

Обратите внимание, что эти две даты представляют собой моменты времени с интервалом в один час (или 2, в зависимости от летнего времени).Части даты и времени эквивалентны, но дата JavaScript указана в UTC, а дата Java показывает часовой пояс CET.Поскольку CET - это UTC + 1 или UTC + 2, в зависимости от DST, они не совпадают.

Похоже, что что-то на стороне Java берет строку даты в формате UTC, игнорирует часовой пояс и десериализует ее как-вход в Java Дата с локальным (CET) часовым поясом.

Просмотр даты на серверной части после того, как она была вставлена ​​в базу данных и затем извлечена снова, оставляет открытой множество возможностей для обнаружения ошибкиявляется.Вам нужно будет проверить его в Spring Controller, сразу после его десериализации, а затем на каждом шаге по пути к базе данных и обратно, чтобы увидеть, где происходит ошибочное преобразование.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...