61 votes

Angular 2 Material 2 format de date du datepicker

J'ai besoin d'aide. Je ne sais pas comment changer le format de date du material 2 datepicker. J'ai lu la documentation mais je ne comprends pas ce que je dois réellement faire. Le format de date de sortie fourni par défaut est par exemple : 6/9/2017

Ce que j'essaie d'atteindre est de changer le format en 9-Juin-2017 ou autre.

La documentation https://material.angular.io/components/component/datepicker ne m'aide pas du tout. Merci d'avance

0 votes

1 votes

Merci pour l'aide mais je ne veux pas utiliser mon propre fournisseur de données, je veux juste changer le format de la date selon la documentation où il est écrit que l'adaptateur de date native peut être utilisé.

47voto

Igor Janković Points 2998

Voici la seule solution que j'ai trouvée pour celle-ci :

Tout d'abord, créez const :

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'},
   }
};

Ensuite, vous devez étendre 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);
   } 
}

Dans la fonction de format, vous pouvez choisir le format que vous voulez

Et enfin, la dernière étape, vous devez l'ajouter dans les fournisseurs de module :

providers: [
    {provide: DateAdapter, useClass: MyDateAdapter},
    {provide: MD_DATE_FORMATS, useValue: MY_DATE_FORMATS},
],

Et c'est tout. Je ne peux pas croire qu'il n'y ait pas de moyen facile de changer le format de la date via @Input mais espérons que cela sera implémenté dans une future version de material 2 (actuellement beta 6).

1 votes

Pouvez-vous le mettre sur plunker ?... J'ai fait exactement ce que vous avez mentionné mais ça n'a pas marché...

0 votes

Quelqu'un peut-il poster un exemple de travail sur plunker? Merci beaucoup!

1 votes

Ça ne fonctionne pas pour moi non plus (béta.8). Erreur : Rejeté (par une promesse) : TypeError: Impossible de lire la propriété 'dateInput' de non défini

43voto

Robouste Points 578

La réponse d'Igor ne fonctionnait pas pour moi, donc j'ai demandé directement sur Angular 2 Material's github et quelqu'un m'a donné cette réponse qui a fonctionné pour moi :

  1. Commencez par écrire votre propre adaptateur :

    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. Créez votre format de date :

    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. Fournissez ces deux éléments à votre module

    providers: [
           {
               provide: DateAdapter, useClass: AppDateAdapter
           },
           {
               provide: MAT_DATE_FORMATS, useValue: APP_DATE_FORMATS
           }
       ]

Plus d'informations ici

EDIT: Pour ceux qui rencontrent des problèmes avec la saisie manuelle ne respectant pas le format, vous pouvez remplacer la fonction parse(value: any) de NativeDateAdapter comme suit.

parse(value: any): Date | null {
   const date = moment(value, 'DD/MM/YYYY');
   return date.isValid() ? date.toDate() : null;
}

Ainsi, l'adaptateur personnalisé prendra la forme finale suivante.

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;
   }
}

2 votes

Préférez ceci en raison du modèle littéral de chaîne ES6, réduit considérablement le code

0 votes

@Robouste cela fonctionne partiellement. Il donne un format spécifique comme Ven 28 Juil 2017 mais si vous modifiez le format, alors l'entrée et le calendrier s'attendent au format US, même si vous avez correctement défini la locale.

1 votes

@VassilisPits Alors que la fonction de format() de l'adaptateur de date native-date-adapter le met en forme de manière élégante, la fonction de parse() de l'adaptateur de date native-date-adapter ne le fait même pas essayer. github.com/angular/material2/blob/master/src/lib/core/datetime/​me/… Vous pouvez remplacer la fonction de parse pour récupérer la date sous forme d'objet date. C'est ce que j'ai fait pour analyser les dates formatées 'de-DE' 'dd.mm.yyyy' en objets Date().

18voto

Abhishek Jha Points 364

Vous devez simplement fournir un MAT_DATE_FORMATS personnalisé

export const APP_DATE_FORMATS = {
    parse: {dateInput: {month: 'short', year: 'numeric', day: 'numeric'}},
    display: {
        dateInput: {month: 'short', year: 'numeric', day: 'numeric'},
        monthYearLabel: {year: 'numeric'}
    }
};

et l'ajouter aux fournisseurs.

fournisseurs: [{
   provide: MAT_DATE_FORMATS, useValue: APP_DATE_FORMATS
}]

Code fonctionnel

6 votes

Comment dd-mm-aaaa ?

0 votes

Intégré cela dans mon fichier app.component.ts principal fonctionne comme un rêve dans les composants enfants

1 votes

J'ai dû l'ajouter séparément dans le composant enfant pour que cela fonctionne.

12voto

luka martinovic Points 117

La solution qui fonctionne pour moi est :

my.component.html:

my.component.ts :

@Component({...
})
export class MyComponent implements OnInit {
  ....
  public someDate: Date;
  ...

Maintenant vous pouvez avoir le format (Ex. 'd-MMM-y') qui fonctionne le mieux pour vous.

1 votes

Fonctionne pour moi sur beta8. Cependant, avec cette option, vous perdez la capacité de taper dans la zone de texte pour modifier la date.

1 votes

Oui. Mais ce n'est pas un gros problème, c'est un problème plus important si les utilisateurs commencent à saisir des dates sans connaître le format exact que vous attendez.

1 votes

Si votre saisie est liée à un formulaire réactif, vous pouvez l'utiliser comme suit :

10voto

Arthur Z. Points 124

Il y a de fortes chances que vous utilisiez déjà une bibliothèque qui vous offre un moyen pratique de manipuler (analyser, valider, afficher, etc.) des dates et heures en JavaScript. Si ce n'est pas le cas, jetez un œil à l'une d'entre elles, par exemple moment.js.

Implémenter votre adaptateur personnalisé en utilisant moment.js ressemblerait à ceci.

Créez CustomDateAdapter.ts et implémentez-le comme ceci:

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'); // Choisissez le paramètre régional
        var formatString = (displayFormat === 'input')? 'DD.MM.YYYY' : 'LLL';
        return moment(date).format(formatString);
    }
}

Dans votre app.module.ts:

import { DateAdapter } from '@angular/material';

providers: [
    ...
    {
        provide: DateAdapter, useClass: CustomDateAdapter
    },
    ...
]

C'est tout. Simple, facile et pas besoin de réinventer la roue.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X