According to NG-Bootstrap DatePicker Date model and format,
Datepicker uses NgbDateStruct interface as a model and not the native Date object.
Hence you need to cast Date String to NgbDateStruct
or NgbDate
type to bind to [(ngModel)]
.
Solution 1: Cast date string to NgbDate
or NgbDate
type.
Cast to NgbDate
type
import { NgbDate } from '@ng-bootstrap/ng-bootstrap';
let date = new Date("2020-10-21T09:39:04.357");
let dateModel: NgbDate = new NgbDate(
date.getFullYear(),
date.getMonth() + 1,
date.getDate())
);
Cast to NgbDateStruct
type
import { NgbDateStruct } from '@ng-bootstrap/ng-bootstrap';
let date = new Date("2020-10-21T09:39:04.357");
let dateModel: NgbDateStruct = {
year: date.getFullYear(),
month: date.getMonth() + 1,
day: date.getDate()
};
Sample Solution 1 on StackBlitz
Solution 2: Apply Custom Date Adapter
Custom Date Adapter allows binding Date String to [(ngModel)]
with customized date string format.
date.adapter.ts
import { Injectable } from '@angular/core';
import {
NgbDateAdapter,
NgbDateParserFormatter,
NgbDateStruct
} from '@ng-bootstrap/ng-bootstrap';
/**
* This Service handles how the date is represented in scripts i.e. ngModel.
*/
@Injectable()
export class CustomAdapter extends NgbDateAdapter<string> {
readonly DELIMITER = '-';
fromModel(value: string | null): NgbDateStruct | null {
if (value) {
let date = new Date(value);
return {
day: date.getDate(),
month: date.getMonth() + 1,
year: date.getFullYear()
};
}
return null;
}
toModel(date: NgbDateStruct | null): string | null {
if (date) {
let dateObj = new Date(date.year, date.month - 1, date.day);
return dateObj.toISOString();
}
return null;
}
}
/**
* This Service handles how the date is rendered and parsed from keyboard i.e. in the bound input field.
*/
@Injectable()
export class CustomDateParserFormatter extends NgbDateParserFormatter {
readonly DELIMITER = '/';
parse(value: string): NgbDateStruct | null {
if (value) {
let date = new Date(value);
return {
day: date.getDate(),
month: date.getMonth() + 1,
year: date.getFullYear()
};
}
return null;
}
format(date: NgbDateStruct | null): string {
return date
? date.day + this.DELIMITER + date.month + this.DELIMITER + date.year
: '';
}
}
app.module.ts
import {
NgbDateAdapter,
NgbDateParserFormatter,
NgbModule
} from '@ng-bootstrap/ng-bootstrap';
import { CustomAdapter, CustomDateParserFormatter } from './datepicker-adapter';
@NgModule({
...
providers: [
{ provide: NgbDateAdapter, useClass: CustomAdapter },
{ provide: NgbDateParserFormatter, useClass: CustomDateParserFormatter }
]
})
export class AppModule {}
Sample Solution 2 on StackBlitz
References
Custom date adapter and formatter