#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» в качестве локали и, следовательно, отображался как «гггг-д-М».
После его удаления и выполните преобразование как:
- Вручную создайте функцию для форматирования в приведенном выше ответе
- Используйте угловое встроенное преобразование даты
И то и другое сработало. Кроме того, необходимо аннулировать кэш из AWS cloudfront. Но все еще не уверен, почему chrome это делает…