Лучший способ сделать это - создать специальный адаптер даты (это сервис). Поскольку вы используете объект JavaScript Date
в качестве базового формата даты, вы можете просто расширить NativeDateAdapter
, предоставленный в @angular/material/core
, и переопределить два метода: parse
и format
. Первый получает объект Date
из вашего строкового формата (например, 01-MAR-2020), а второй получает объект строки из Date
объекта (например, вашей функции formatDate
, представленной в вопросе). текст, делает).
После создания вашего собственного собственного класса адаптера даты, просто укажите его в AppModule
, используя токен DateAdapter
:
import {DateAdapter} from '@angular/material/core';
...
@NgModule({
...
providers: [{provide: DateAdapter, useClass: CustomNativeDateAdapter}]
...
})
export class AppModule {}
Относительно класса CustomNativeDateAdapter
, в вашем случае это будет что-то вроде:
import { Injectable } from '@angular/core';
import { NativeDateAdapter } from '@angular/material/core';
@Injectable()
export class CustomNativeDateAdapter extends NativeDateAdapter {
months: string[] = [ 'JAN', 'FEB', 'MAR', 'APR', 'MAY',
'JUN', 'JUL', 'AUG', 'SEP', 'OCT', 'NOV', 'DEC' ];
monthsObj: { [key: string]: number } = { JAN: 0, FEB: 1, MAR: 2, APR: 3,
MAY: 4, JUN: 5, JUL: 6, AUG: 7, SEP: 8, OCT: 9, NOV: 10, DEC: 11 };
parse(value: any): Date | null {
if (typeof value == 'number') {
return new Date(value);
}
const dateRegex: RegExp = /^(0|1)[1-9]-[A-Z]{3}-(1|2)[0-9]{3}$/;
if (typeof value == 'string' && dateRegex.test(value)) {
const dateSplit = value.split('-');
return new Date(+dateSplit[2], this.monthsObj[dateSplit[1]],
+dateSplit[0], 12, 0, 0, 0);
}
return null;
}
format(date: Date, displayFormat: Object): string {
if (!this.isValid(date)) {
throw Error('NativeDateAdapter: Cannot format invalid date.');
}
let formatDate = ('0' + date.getDate()).slice(-2) +
'-' + this.months[date.getMonth()] + '-' + date.getFullYear();
return formatDate;
}
}