我需要帮助。我不知道如何更改材料2日期选择器的日期格式。我已经阅读了文档,但我不明白我真正需要做什么。datepicker 默认提供的输出日期格式为 fe: 6/9/2017
我想要实现的是将格式更改为 9-Jun-2017 或任何其他格式。
文档https://material.angular.io/components/component/datepicker根本没有帮助我。提前致谢
我需要帮助。我不知道如何更改材料2日期选择器的日期格式。我已经阅读了文档,但我不明白我真正需要做什么。datepicker 默认提供的输出日期格式为 fe: 6/9/2017
我想要实现的是将格式更改为 9-Jun-2017 或任何其他格式。
文档https://material.angular.io/components/component/datepicker根本没有帮助我。提前致谢
这是我找到的唯一解决方案:
首先,创建常量:
const MY_DATE_FORMATS = {
parse: {
dateInput: {month: 'short', year: 'numeric', day: 'numeric'}
},
display: {
// dateInput: { month: 'short', year: 'numeric', day: 'numeric' },
dateInput: 'input',
monthYearLabel: {year: 'numeric', month: 'short'},
dateA11yLabel: {year: 'numeric', month: 'long', day: 'numeric'},
monthYearA11yLabel: {year: 'numeric', month: 'long'},
}
};
然后你必须扩展 NativeDateADapter:
export class MyDateAdapter extends NativeDateAdapter {
format(date: Date, displayFormat: Object): 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);
}
}
在格式功能中,您可以选择您想要的任何格式
最后一步,您必须将其添加到module提供程序中:
providers: [
{provide: DateAdapter, useClass: MyDateAdapter},
{provide: MD_DATE_FORMATS, useValue: MY_DATE_FORMATS},
],
就是这样。我不敢相信没有一些简单的方法可以通过 @Input 更改日期格式,但我们希望它会在未来的材料 2 版本(目前是beta 6)中实现。
Igor 的回答对我不起作用,所以我直接在Angular 2 Material 的 github上提问,有人给了我这个对我有用的答案:
首先编写自己的适配器:
import { NativeDateAdapter } from "@angular/material";
export class AppDateAdapter extends NativeDateAdapter {
format(date: Date, displayFormat: Object): string {
if (displayFormat === 'input') {
const day = date.getDate();
const month = date.getMonth() + 1;
const year = date.getFullYear();
return `${day}-${month}-${year}`;
}
return date.toDateString();
}
}
创建您的日期格式:
export const APP_DATE_FORMATS =
{
parse: {
dateInput: { month: 'short', year: 'numeric', day: 'numeric' },
},
display: {
dateInput: 'input',
monthYearLabel: { year: 'numeric', month: 'numeric' },
dateA11yLabel: { year: 'numeric', month: 'long', day: 'numeric' },
monthYearA11yLabel: { year: 'numeric', month: 'long' },
}
};
将这两个提供给您的module
providers: [
{
provide: DateAdapter, useClass: AppDateAdapter
},
{
provide: MAT_DATE_FORMATS, useValue: APP_DATE_FORMATS
}
]
更多信息在这里
编辑:对于那些因手动输入不符合格式而遇到麻烦的人,您可以按如下方式覆盖该parse(value: any)
功能NativeDateAdapter
。
parse(value: any): Date | null {
const date = moment(value, 'DD/MM/YYYY');
return date.isValid() ? date.toDate() : null;
}
因此,自定义适配器将采用如下最终形状。
import { NativeDateAdapter } from "@angular/material";
import * as moment from 'moment';
export class AppDateAdapter extends NativeDateAdapter {
format(date: Date, displayFormat: Object): string {
if (displayFormat === 'input') {
const day = date.getDate();
const month = date.getMonth() + 1;
const year = date.getFullYear();
return `${day}/${month}/${year}`;
}
return date.toDateString();
}
parse(value: any): Date | null {
const date = moment(value, environment.APP_DATE_FORMAT);
return date.isValid() ? date.toDate() : null;
}
}
您只需要提供自定义 MAT_DATE_FORMATS
export const APP_DATE_FORMATS = {
parse: {dateInput: {month: 'short', year: 'numeric', day: 'numeric'}},
display: {
dateInput: {month: 'short', year: 'numeric', day: 'numeric'},
monthYearLabel: {year: 'numeric'}
}
};
并将其添加到提供者。
providers: [{
provide: MAT_DATE_FORMATS, useValue: APP_DATE_FORMATS
}]
工作代码
对我有用的解决方法是:
my.component.html:
<md-input-container>
<input mdInput disabled [ngModel]="someDate | date:'d-MMM-y'" >
<input mdInput [hidden]='true' [(ngModel)]="someDate"
[mdDatepicker]="picker">
<button mdSuffix [mdDatepickerToggle]="picker"></button>
</md-input-container>
<md-datepicker #picker></md-datepicker>
my.component.ts :
@Component({...
})
export class MyComponent implements OnInit {
....
public someDate: Date;
...
所以现在您可以拥有最适合您的格式(例如“d-MMM-y”)。
您很有可能已经使用了一个库,该库为您提供了一种在 JavaScript 中操作(解析、验证、显示等)日期和时间的便捷方式。如果没有,请查看其中一个,例如moment.js。
使用 moment.js 实现您的自定义适配器看起来像这样。
创建CustomDateAdapter.ts并像这样实现它:
import { NativeDateAdapter } from "@angular/material";
import * as moment from 'moment';
export class CustomDateAdapter extends NativeDateAdapter {
format(date: Date, displayFormat: Object): string {
moment.locale('ru-RU'); // Choose the locale
var formatString = (displayFormat === 'input')? 'DD.MM.YYYY' : 'LLL';
return moment(date).format(formatString);
}
}
在您的app.module.ts 中:
import { DateAdapter } from '@angular/material';
providers: [
...
{
provide: DateAdapter, useClass: CustomDateAdapter
},
...
]
而已。简单、容易,无需重新发明自行车。