У меня есть поле даты, определенное в HTML
<input type = "date" name = "" (change) = "handleBlur($event)" min = "1970-01-01" max = "9999-12-31"
value = "{{ somedate| date:'yyyy-MM-dd' }}">
и в файле ts я обрабатываю событие onchange
handleBlur(event: any) {
this.somedate= new Date(event.target.value).toISOString()
console.info('after', this.somedate)
this.formobject.controls['somedate'].setValue(this.somedate)
this.appService.updateSaveDataValue({ somedate: this.somedate})
}
Этот контроль даты отлично работает в некоторых странах X, но не в других. Я имею в виду, что пользователь может выбрать дату из элемента управления календарем, а также ввести значение даты. Однако, когда пользователь использует идентичный инструмент из региона США, этот элемент управления ведет себя странно. При изменении года каждая клавиша уменьшает день на единицу, а когда пользователь меняет день, месяц уменьшается на единицу. Я не знаю, как это исправить или в чем причина проблемы.





Объекты даты JavaScript имеют компонент времени. new Date(...) создаст новый объект Date со временем «сейчас» в текущем часовом поясе пользователя. При преобразовании этого объекта даты в строку ISO будет стандартизирован компонент времени, что может привести к изменению самой даты.
Например, рассмотрим, выбираю ли я дату 2 апреля 2022 года ровно в 00:30 утра в часовом поясе GMT+1. Когда .toISOString() вызывается для этого объекта даты, он будет преобразован в 1 апреля 2022 года в 23:30 для GMT+0. Это может произойти и в обратном направлении, а также ближе к полуночи.
Чтобы избежать этого, вы можете вручную создать строку ISO из дня, месяца и года в объекте даты или привлечь библиотеку, которая поможет сделать это за вас. Существует несколько библиотек, которые могут помочь с управлением датами, например, momentjs, Day.js, date-fns и т. д.