Дата идет 3 часа назад в Angular 7 - PullRequest
2 голосов
/ 05 марта 2019

Я использую Angular 7. И у меня есть средство выбора даты. И, например, я выбираю 2019-03-26. Но когда я нажимаю кнопку save, консоль показывает мне как 2019-03-25T21:00:00.000Z. Это будет 3 часа назад . В чем может быть причина этой ошибки?

STACKBLITZ

Я использую primeng 7.0.5.

Ответы [ 5 ]

2 голосов
/ 05 марта 2019

На самом деле это происходит потому, что вы видите console.log окна браузера, имитирующего сервер Stackblitz, поэтому он печатает DateTime в часовом поясе UTC по журналу консоли сервера, смоделированному сервером.

{birthDate: "2019-03-15T14:56:04.000Z"} //Printin UTC Time

Чтобы проверить это правильно, нажмите Открыть в новом окне , и тогда он покажет правильный DateTime, как показано ниже.

enter image description here

Вот окно в реальном времени

0 голосов
/ 07 марта 2019

Я нашел решение. Primeng календарь имеет свойство dataType. Тип данных по умолчанию date. Если вы установите string вместо date, тогда он отлично работает и отправляет правильную дату на сервер.

StackBlitz

Вы можете видеть из рабочего примера по этой ссылке на стек.

0 голосов
/ 05 марта 2019

Это связано со смещением часового пояса. Из формы вы получаете дату по Гринвичу, поэтому, когда вы попытаетесь напечатать дату на консоли, вы настроите время на местный часовой пояс. Таким образом, вы должны настроить дату и время по местному часовому поясу при печати. ​​

Попробуйте это:

 save() {
    let localDate = new Date( this.myForm.value.birthDate.getTime() + Math.abs(this.myForm.value.birthDate.getTimezoneOffset()*60000) ) 
    console.log(this.myForm.value);
    console.log(localDate);
  }
0 голосов
/ 05 марта 2019

Большинство календарей пользовательского интерфейса хранят введенную дату как UTC (Всемирное координированное время), дату или метку времени. Но отображаемая в дату пользователя конвертируется с вашим местным часовым поясом, который может отличаться от UTC.

console.log(_Date_) печатает время UTC, если вы хотите увидеть это время в вашем местном часовом поясе, вы можете использовать такие методы, как getHours().

Итак, если вы напечатаете this.myForm.value.birthDate.getHours(), вы увидите правильные местные часы. Но вы не должны конвертировать сохраненное время в ваше местное

0 голосов
/ 05 марта 2019

Вы находитесь в местном часовом поясе, а средство выбора даты возвращает даты в UTC. Вы можете исправить это, уменьшив смещение часового пояса от даты UTC.

Поскольку смещение часового пояса происходит в минутах, но объекты Date рассчитываются в миллисекундах с 1970 года, вам необходимо умножить смещение на 1000 * 60.

const utcDate = '2019-05-01T00:00:00Z';
const localDate = new Date(new Date(utcDate) - new Date().getTimezoneOffset() * 1000 * 60);
...