Chrome: Дата отправки в формате «гггг-ММ-дд» изменяется на «гггг-дд-ММ» в chrome при отправке запроса API в URL

#javascript #angular #google-chrome #datetime #browser

Вопрос:

Я получаю информацию о календаре, передавая даты начала и окончания (явно с гггг-ММ-дд), как это:

ПРЕОБРАЗОВАНИЕ ДАТЫ:

 initDates = () => {
this.startDate = new Date(new Date().getFullYear(), 0, 1);
this.endDate = new Date(new Date().getFullYear(), 11, 31);
this.calendarStartDate = this.datePipe.transform(this.startDate, 'yyyy-MM-dd');
this.calendarEndDate = this.datePipe.transform(this.endDate, 'yyyy-MM-dd')};
 

СЛУЖБА вызывается с датами начала и окончания:

 this.getCalendarByCodeAndDates(url, calendarCode, this.calendarStartDate, this.calendarEndDate);

getCalendarByCodeAndDates = (url: string, calenderCode: string = '', startDate: string = '', endDate: string = '') => {
  return this.http.get(encodeURI(`${url}?calendarCode=${calenderCode}amp;startDate=${startDate}amp;endDate=${endDate}`))
  .pipe(map(response => response),
    catchError(err => throwError(err))
  )};
 

Но в сетевом запросе chrome он преобразуется в формат времени США (гггг-дд-ММ). Я не уверен, почему он использует локализацию по умолчанию, хотя явно передаю формат.

Он работает в некоторых системах Windows и не работает в других. Не в состоянии понять его поведение. Это происходит только в Chrome.

Есть какое-нибудь решение для этого? (Прилагается скриншот сетевого запроса)

Сетевой запрос (даты начала и окончания)

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

1. Где та часть, где вы явно форматируете дату?

2. Я обновил описание датами, которые я передаю.

3. Снимок экрана вашего сетевого запроса показывает, что он отформатирован YYYY-MM-DD от «2021-01-01» до «2021-12-31». Ваша проблема, похоже, заключается в том, что серверная часть не возвращает никаких данных для этих диапазонов дат.

Ответ №1:

каков ваш тип «Дата начала»? если это дата, вам нужно ее отформатировать.

вы можете написать отладочный код в свой файл, чтобы показать его реальную ценность, например : alert(startDate)

 function getYmd(date) {
    var year = date.getFullYear();
    var month = date.getMonth()   1;
    var strDate = date.getDate();
    if (month >= 1 amp;amp; month <= 9) {
        month = "0"   month;
    }
    if (strDate >= 0 amp;amp; strDate <= 9) {
        strDate = "0"   strDate;
    }
    var currentdate = year   '-'   month   '-'   strDate;
    return currentdate;
}
 

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

1. потому что вы связываете URL-адрес с датой начала, а не с датой начала календаря

2. Нет, это параметр функции. Я добавил услугу в описание и обновил.

3. вам нужна дата клиента.toString, не зависите от chrome, код, написанный в содержимом ответа.

4. Даты начала и окончания в виде строки берутся из канала угловой даты «this.DatePipe.transform(this.EndDate, ‘гггг-ММ-дд’)};» аналогично функции, которую вы написали. Это делает это за вас. Проблема в том, что chrome отправляет запрос.

5. вы добавили alert(startDate) перед http-запросом?

Ответ №2:

Я должен знать проблему, вот она:

 const startDateString = new Date(startDate.getFullYear(), startDate.getMonth(), startDate.getDate()).toLocaleDateString();
const formattedStartDate = this.getHyphenSeparatedDate(startDateString);
 

Преобразование в localeString() было проблемой, так как chrome по умолчанию использует «en-us» в качестве локали и, следовательно, отображался как «гггг-д-М».
После его удаления и выполните преобразование как:

  1. Вручную создайте функцию для форматирования в приведенном выше ответе
  2. Используйте угловое встроенное преобразование даты

И то и другое сработало. Кроме того, необходимо аннулировать кэш из AWS cloudfront. Но все еще не уверен, почему chrome это делает…