角度材料-手动输入错误地转换了日期

时间:2018-10-11 08:41:48

标签: angular angular-material

ive将日期的语言环境设置为en-GB-这样日期选择器可以采用英国格式。

如果我手动输入日期10/12/2018(2018年12月10日)并点击选项卡,则日期将转换为12/10/2018(2018年10月12日)。

使用选择器选择原始日期可以很好地工作,只有在手动输入日期和指定区域设置时才会出现此问题。

https://stackblitz.com/edit/angular-hv6jny

<mat-form-field>
  <input matInput [matDatepicker]="picker" placeholder="Choose a date">
  <mat-datepicker-toggle matSuffix [for]="picker"></mat-datepicker-toggle>
  <mat-datepicker #picker></mat-datepicker>
</mat-form-field>

-

  providers: [
    { provide: MAT_DATE_LOCALE, useValue: 'en-GB' },
  ]

这是日期选择器的错误吗?

2 个答案:

答案 0 :(得分:4)

这不是错误。您需要构建一个像这样的自定义日期适配器:

export class CustomDateAdapter 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: Object): string {
    date = new Date(Date.UTC(
      date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(),
      date.getMinutes(), date.getSeconds(), date.getMilliseconds()));
    displayFormat = Object.assign({}, displayFormat, { timeZone: 'utc' });

    const dtf = new Intl.DateTimeFormat(this.locale, displayFormat);
    return dtf.format(date).replace(/[\u200e\u200f]/g, '');
  }

}

,然后在您的应用中使用它:

@NgModule({
    ....
    provide: DateAdapter, useClass: CustomDateAdapter }
})

DEMO

答案 1 :(得分:0)

要支持使用点代替斜杠的其他语言环境,还可以使用一下dateadapter和format。 Moment开箱即用地支持此功能。

npm install moment @angular/material-moment-adapter --save

app.module.ts

  providers: [
    {
      provide: DateAdapter,
      useClass: MomentDateAdapter,
      deps: [MAT_DATE_LOCALE]
    },
    {
      provide: MAT_DATE_FORMATS,
      useValue: MAT_MOMENT_DATE_FORMATS
    }
  ],