Angular материал 2, изменить датуpicker Формат даты "MM/DD/YYYY" на "DD/MM/YYYY" странное поведение
Я просто попытался изменить angular материал 2 даты-выборщик по умолчанию Формат даты ММ/ДД/ГГГГ на DD/MM/YYYY или DD.MM.YYYY или не менее DD-MM-YYYY
В соответствии с этот вопрос и, как упоминалось в документации
providers: [{provide: MD_DATE_FORMATS, useValue: MY_NATIVE_DATE_FORMATS}]
Итак, попытались следующие подходы
Подход 1 plunkr: войти в формат DD-MM-YYYY
Подход 2 plunkr: войти в формат DD.MM.YYYY
Подход 3 plunkr: войти в формат DD/MM/YYYY
но каждый из них подходит к обычной, пока я не выберем Дата от 1 до 12,
для ex: Сегодня дата 25 сентября 2017 года, если я выбрал 12 сентября 2017 года как дату, а затем снова нажмите кнопку datepicker, я могу увидеть дату календаря, взятую как 09 ноября 2017 года (09/11/2017) не так (11/09/2017), который, как представляется, формат даты по умолчанию не переопределяется правильно
Ответы
Ответ 1
1/DOCS: сочетая синтаксический анализ и формат отображения с пользовательским указателем даты
В пользовательском адаптере даты (например, AppDateAdapter) добавьте метод синтаксического анализа, чтобы проанализировать новый формат даты (ДД/ММ/ГГГГ) для даты, действительной:
например, для формата DD/MM/YYYY, синтаксический анализ может быть:
parse(value: any): Date | null {
if ((typeof value === 'string') && (value.indexOf('/') > -1)) {
const str = value.split('/');
const year = Number(str[2]);
const month = Number(str[1]) - 1;
const date = Number(str[0]);
return new Date(year, month, date);
}
const timestamp = typeof value === 'number' ? value : Date.parse(value);
return isNaN(timestamp) ? null : new Date(timestamp);
}
рабочий стек стека: https://stackblitz.com/edit/angular-material-datepicker-format?embed=1&file=app/date.adapter.ts
ваш полный адаптер даты:
export class AppDateAdapter extends NativeDateAdapter {
parse(value: any): Date | null {
if ((typeof value === 'string') && (value.indexOf('/') > -1)) {
const str = value.split('/');
const year = Number(str[2]);
const month = Number(str[1]) - 1;
const date = Number(str[0]);
return new Date(year, month, date);
}
const timestamp = typeof value === 'number' ? value : Date.parse(value);
return isNaN(timestamp) ? null : new Date(timestamp);
}
format(date: Date, displayFormat: any): string {
if (displayFormat == "input") {
let day = date.getDate();
let month = date.getMonth() + 1;
let year = date.getFullYear();
return this._to2digit(day) + '/' + this._to2digit(month) + '/' + year;
} else {
return date.toDateString();
}
}
private _to2digit(n: number) {
return ('00' + n).slice(-2);
}
}
Преимущество этого подхода заключается в том, что вы также можете настраивать формат monthYearLabel
в константах отображения и иметь календарь, который выглядит следующим образом:
![enter image description here]()
Ответ 2
Используйте это в вашем app.module.ts
в массиве providers:
{provide: MAT_DATE_LOCALE, useValue: 'en-GB'}
Ответ 3
Одним из возможных решений является просто определение собственного формата ввода:
export const DD_MM_YYYY_Format = {
parse: {
dateInput: 'LL',
},
display: {
dateInput: 'DD/MM/YYYY',
monthYearLabel: 'MMM YYYY',
dateA11yLabel: 'LL',
monthYearA11yLabel: 'MMMM YYYY',
},
};
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css'],
providers: [
{provide: MAT_DATE_FORMATS, useValue: DD_MM_YYYY_Format},
]
})
export class AppComponent implemets OnInit {
// ... some code
}
Следующий код говорит инжектору возвращать DD_MM_YYYY_Format
, когда что-то запрашивает MAT_DATE_FORMATS
(подробнее см. здесь). Внутри вашего пользовательского формата свойство display.dateInput
установлено на DD/MM/YYYY
.
Ответ 4
Обновленная версия Fetrarij, для формата даты dd.mm.yyyy с первым днем понедельника:
{ provide: MAT_DATE_LOCALE, useValue: 'sk-SK' },
- расширение адаптера даты:
@Injectable()
export class DateAdapterSK extends NativeDateAdapter {
getFirstDayOfWeek(): number {
return 1;
}
parse(value: any): Date | null {
if ((typeof value === 'string') && (value.indexOf('.') > -1)) {
const str = value.split('.');
const year = Number(str[2]);
const month = Number(str[1]) - 1;
const date = Number(str[0]);
return new Date(year, month, date);
}
const timestamp = typeof value === 'number' ? value : Date.parse(value);
return isNaN(timestamp) ? null : new Date(timestamp);
}
}
Работа для меня. Угловой 6.
Ответ 5
Используйте его в разделе поставщиков вашего модуля
{provide: MAT_DATE_LOCALE, useValue: 'en-GB'}