Comment définir les paramètres régionaux dans DatePipe dans Angular 2?

Je veux afficher la Date en utilisant le format européen dd/mm/yyyy mais en utilisant DatePipe shortdate le format ne s'affiche qu'en utilisant le style de date américain mm/dd/yyyy.
Je suppose que les paramètres régionaux par défaut sont en_US. Peut-être que je manque dans les documents, mais comment puis-je changer les paramètres régionaux par défaut dans une application Angular2? Ou peut-être y a-t-il un moyen de passer un format personnalisé à DatePipe ?

96
demandé sur Amir 2016-01-20 18:57:39

11 réponses

Depuis Angular2 RC6, vous pouvez définir les paramètres régionaux par défaut dans votre module d'application, en ajoutant un fournisseur:

@NgModule({
  providers: [
    { provide: LOCALE_ID, useValue: "en-US" }, //replace "en-US" with your locale
    //otherProviders...
  ]
})

Les pipes Devise/Date/Nombre doivent prendre les paramètres régionaux. LOCALE_ID est un OpaqueToken , à importer depuis angular / core.

import { LOCALE_ID } from '@angular/core';

Pour un cas d'utilisation plus avancé, vous pouvez choisir les paramètres régionaux d'un service. Les paramètres régionaux seront résolus (une fois) lorsque le composant utilisant le canal de date est créé:

{
  provide: LOCALE_ID,
  deps: [SettingsService],      //some service handling global settings
  useFactory: (settingsService) => settingsService.getLanguage()  //returns locale string
}

J'espère que cela fonctionne pour vous.

209
répondu corolla 2016-12-26 19:17:52

La Solution avec LOCALE_ID est idéale si vous voulez définir la langue de votre application Une fois. Mais cela ne fonctionne pas, si vous voulez changer la langue pendant l'exécution. Pour ce cas, vous pouvez implémenter un tube de date personnalisé.

import { DatePipe } from '@angular/common';
import { Pipe, PipeTransform } from '@angular/core';
import { TranslateService } from '@ngx-translate/core';

@Pipe({
  name: 'localizedDate',
  pure: false
})
export class LocalizedDatePipe implements PipeTransform {

  constructor(private translateService: TranslateService) {
  }

  transform(value: any, pattern: string = 'mediumDate'): any {
    const datePipe: DatePipe = new DatePipe(this.translateService.currentLang);
    return datePipe.transform(value, pattern);
  }

}

Maintenant, si vous changez la langue d'affichage de L'application en utilisant TranslateService (voir ngx-translate)

this.translateService.use('en');

Les formats de votre application devraient être automatiquement mis à jour.

Exemple d'utilisation:

<p>{{ 'note.created-at' | translate:{date: note.createdAt | localizedDate} }}</p>
<p>{{ 'note.updated-at' | translate:{date: note.updatedAt | localizedDate:'fullDate'} }}</p>

Ou consultez mon simple projet "Notes" ici.

entrez la description de l'image ici

38
répondu Milan Hlinák 2017-08-10 22:55:39

Avec angular5 la réponse ci-dessus ne fonctionne plus!

Le code suivant:

app.module.ts

@NgModule({
  providers: [
    { provide: LOCALE_ID, useValue: "de-at" }, //replace "de-at" with your locale
    //otherProviders...
  ]
})

Conduit à l'erreur suivante:

Erreur: données locales manquantes pour la locale "de-at".

Avec angular5 vous devez charger et enregistrer les paramètres régionaux utilisés fichier sur votre propre.

app.module.ts

import { NgModule, LOCALE_ID } from '@angular/core';
import { registerLocaleData } from '@angular/common';
import lcoaleDeAt from '@angular/common/locales/de-at';

registerLocaleData(lcoaleDeAt);

@NgModule({
  providers: [
    { provide: LOCALE_ID, useValue: "de-at" }, //replace "de-at" with your locale
    //otherProviders...
  ]
})

Documentation

22
répondu zgue 2018-01-25 13:32:21

J'ai regardé dans date_pipe.ts et il a deux bits d'information qui sont d'intérêt. près du sommet sont les deux lignes suivantes:

// TODO: move to a global configurable location along with other i18n components.
var defaultLocale: string = 'en-US';

Près du bas se trouve cette ligne:

return DateFormatter.format(value, defaultLocale, pattern);

Cela me suggère que le tube de date est actuellement codé en dur pour être 'en-US'.

Veuillez m'éclairer si je me trompe.

12
répondu Mark Farmiloe 2016-01-26 16:20:40

Vous faites quelque chose comme ceci:

{{ dateObj | date:'shortDate' }}

Ou

{{ dateObj | date:'ddmmy' }}

Voir: https://angular.io/docs/ts/latest/api/common/index/DatePipe-pipe.html

4
répondu Langley 2016-12-28 17:54:04

Je luttais avec le même problème et ne fonctionnais pas pour moi en utilisant ceci

{{dateObj | date:'ydM'}}

Donc, j'ai essayé une solution de contournement, pas la meilleure solution mais cela a fonctionné:

{{dateObj | date:'d'}}/{{dateObj | date:'M'}}/{{dateObj | date:'y'}}

Je peux toujours créer un tuyau personnalisé.

3
répondu hydrangenius 2016-02-20 18:38:07

Pour ceux qui ont des problèmes avec AOT, vous devez le faire un peu différemment avec un useFactory:

export function getCulture() {
    return 'fr-CA';
}

@NgModule({
  providers: [
    { provide: LOCALE_ID, useFactory: getCulture },
    //otherProviders...
  ]
})
2
répondu vidalsasoon 2017-10-17 14:06:29

Copié le tuyau google a changé les paramètres régionaux et cela fonctionne pour mon pays, il est possible qu'ils ne l'aient pas terminé pour tous les paramètres régionaux. Ci-dessous est le code.

import {
    isDate,
    isNumber,
    isPresent,
    Date,
    DateWrapper,
    CONST,
    isBlank,
    FunctionWrapper
} from 'angular2/src/facade/lang';
import {DateFormatter} from 'angular2/src/facade/intl';
import {PipeTransform, WrappedValue, Pipe, Injectable} from 'angular2/core';
import {StringMapWrapper, ListWrapper} from 'angular2/src/facade/collection';


var defaultLocale: string = 'hr';

@CONST()
@Pipe({ name: 'mydate', pure: true })
@Injectable()
export class DatetimeTempPipe implements PipeTransform {
    /** @internal */
    static _ALIASES: { [key: string]: String } = {
        'medium': 'yMMMdjms',
        'short': 'yMdjm',
        'fullDate': 'yMMMMEEEEd',
        'longDate': 'yMMMMd',
        'mediumDate': 'yMMMd',
        'shortDate': 'yMd',
        'mediumTime': 'jms',
        'shortTime': 'jm'
    };


    transform(value: any, args: any[]): string {
        if (isBlank(value)) return null;

        if (!this.supports(value)) {
            console.log("DOES NOT SUPPORT THIS DUEYE ERROR");
        }

        var pattern: string = isPresent(args) && args.length > 0 ? args[0] : 'mediumDate';
        if (isNumber(value)) {
            value = DateWrapper.fromMillis(value);
        }
        if (StringMapWrapper.contains(DatetimeTempPipe._ALIASES, pattern)) {
            pattern = <string>StringMapWrapper.get(DatetimeTempPipe._ALIASES, pattern);
        }
        return DateFormatter.format(value, defaultLocale, pattern);
    }

    supports(obj: any): boolean { return isDate(obj) || isNumber(obj); }
}
0
répondu Dživo Jelić 2016-04-18 20:30:23

Ok, je propose cette solution, très simple, en utilisant ngx-translate

import { DatePipe } from '@angular/common';
import { Pipe, PipeTransform } from '@angular/core';
import { TranslateService } from '@ngx-translate/core';

@Pipe({
  name: 'localizedDate',
  pure: false
})
export class LocalizedDatePipe implements PipeTransform {

  constructor(private translateService: TranslateService) {
}

  transform(value: any): any {
    const date = new Date(value);

    const options = { weekday: 'long',
                  year: 'numeric',
                  month: 'long',
                  day: 'numeric',
                  hour: '2-digit',
                  minute: '2-digit',
                  second: '2-digit'
                    };

    return date.toLocaleString(this.translateService.currentLang, options);
  }

}
0
répondu LizanLycan 2018-01-22 01:53:00

Cela pourrait être un peu en retard, mais dans mon cas (angular 6), j'ai créé un simple tuyau au-dessus de DatePipe, quelque chose comme ceci:

private _regionSub: Subscription;
private _localeId: string;

constructor(private _datePipe: DatePipe, private _store: Store<any>) {
  this._localeId = 'en-AU';
  this._regionSub = this._store.pipe(select(selectLocaleId))
    .subscribe((localeId: string) => {
      this._localeId = localeId || 'en-AU';
    });
}

ngOnDestroy() { // Unsubscribe }

transform(value: string | number, format?: string): string {
  const dateFormat = format || getLocaleDateFormat(this._localeId, FormatWidth.Short);
  return this._datePipe.transform(value, dateFormat, undefined, this._localeId);
}

Peut ne pas être la meilleure solution, mais simple et fonctionne.

0
répondu Ngoc Nam Nguyen 2018-06-20 01:12:45

Sur l'application.module.ts ajouter les importations suivantes. Il y a une liste d'options de paramètres régionaux ici .

import es from '@angular/common/locales/es';
import { registerLocaleData } from '@angular/common';
registerLocaleData(es);

Puis ajoutez le fournisseur

@NgModule({
  providers: [
    { provide: LOCALE_ID, useValue: "es-ES" }, //your locale
  ]
})

Utiliser des tuyaux en html. Voici la documentation angulaire pour cela.

{{ dateObject | date: 'medium' }}
0
répondu Alejandro del Río 2018-10-01 14:57:26