Angular 2 Material 2 datepicker 日期格式

IT技术 javascript angular angular-material2
2021-02-20 02:12:52

我需要帮助。我不知道如何更改材料2日期选择器的日期格式。我已经阅读了文档,但我不明白我真正需要做什么。datepicker 默认提供的输出日期格式为 fe: 6/9/2017

我想要实现的是将格式更改为 9-Jun-2017 或任何其他格式。

文档https://material.angular.io/components/component/datepicker根本没有帮助我。提前致谢

6个回答

这是我找到的唯一解决方案:

首先,创建常量:

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)中实现。

对于那些不能让这个例子工作的人,添加constructor() {super('en-US');}MyDateAdapter类中。
2021-04-18 02:12:52
你能把它放在plunker上吗?...我完全按照你说的做了,但没有用...
2021-04-22 02:12:52
任何人都可以在plunker上发布一个工作示例吗?多谢!
2021-04-25 02:12:52
它也不适合我(beta.8)。 Error: Uncaught (in promise): TypeError: Cannot read property 'dateInput' of undefined
2021-05-01 02:12:52
仅供参考:MD_DATE_FORMATS 现在已被 MAT_DATE_FORMATS 取代。你可以这样导入:import { DateAdapter, NativeDateAdapter, MAT_DATE_FORMATS, MAT_DATE_LOCALE } from "@angular/material/core";
2021-05-14 02:12:52

Igor 的回答对我不起作用,所以我直接在Angular 2 Material 的 github上提问,有人给了我这个对我有用的答案:

  1. 首先编写自己的适配器:

    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();
        }
    }
    
  2. 创建您的日期格式:

    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' },
        }
    };
    
  3. 将这两个提供给您的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 而不是 MD_?
2021-04-17 02:12:52
@VassilisPits 虽然 native-date-adapter format() 函数很好地展示了它,但 native-date-adapter parse() 函数甚至没有尝试。github.com/angular/material2/blob/master/src/lib/core/datetime/...您可以覆盖解析函数以将日期返回到日期对象中。这就是我将 'de-DE' 格式的日期 'dd.mm.yyyy' 解析回 Date() 对象所做的工作。
2021-04-24 02:12:52
由于 ES6 字符串文字模板,更喜欢这个,显着减少代码
2021-04-28 02:12:52
@Robouste 这部分工作。它提供了一个特定的格式,Fri 28 Jul 2017但如果您更改格式,那么即使您正确设置了语言环境,输入和日历也需要美国格式。
2021-05-09 02:12:52
谢谢,它对我有用,但是当我手动填写输入时,它仍然使用旧格式,您有解决方案吗?
2021-05-17 02:12:52

您只需要提供自定义 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
}]

工作代码

@PrashantPimpale 似乎您必须编写自己的适配器。
2021-04-23 02:12:52
将此集成到我的主 app.component.ts 中,就像在子组件中做梦一样
2021-05-06 02:12:52
dd-mm-yyyy 怎么样?
2021-05-13 02:12:52
我不得不将它单独添加到子组件中才能工作。
2021-05-15 02:12:52

对我有用的解决方法是:

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”)。

是的。但这不是一个大问题,如果用户在不知道您期望的确切格式的情况下开始输入日期,则问题更大。
2021-04-18 02:12:52
在 beta8 上对我有用。但是,使用此选项,您将无法在文本框中键入以编辑日期。
2021-05-02 02:12:52
如果您的输入绑定了一个响应式表单,您可以像这样使用它: <form [formGroup]="myForm"> <input [value]="myForm.get('date').value | date: 'MM/YYYY'" formControlName="date"> </form>
2021-05-02 02:12:52

您很有可能已经使用了一个库,该库为您提供了一种在 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
    },
    ...
]

而已。简单、容易,无需重新发明自行车。