D'autres réponses ne fonctionnent pas en angulaire 5?
J'ai reçu une erreur car DatePipe n'est pas un fournisseur, il ne peut donc pas être injecté. Une solution consiste à le mettre en tant que fournisseur dans votre module d'application, mais ma solution préférée était de l'instancier.
Instanciez-le si nécessaire:
J'ai regardé le code source de DatePipe pour voir comment il a obtenu les paramètres régionaux: https://github.com/angular/angular/blob/5.2.5/packages/common/src/pipes/date_pipe.ts#L15-L174
Je voulais l'utiliser dans un tuyau, donc mon exemple est dans un autre tuyau:
import { Pipe, PipeTransform, Inject, LOCALE_ID } from '@angular/core';
import { DatePipe } from '@angular/common';
@Pipe({
name: 'when',
})
export class WhenPipe implements PipeTransform {
static today = new Date((new Date).toDateString().split(' ').slice(1).join(' '));
datePipe: DatePipe;
constructor(@Inject(LOCALE_ID) private locale: string) {
this.datePipe = new DatePipe(locale);
}
transform(value: string | Date): string {
if (typeof(value) === 'string')
value = new Date(value);
return this.datePipe.transform(value, value < WhenPipe.today ? 'MMM d': 'shortTime')
}
}
La clé ici est d'importer Inject et LOCALE_ID à partir du noyau angulaire, puis de l'injecter pour que vous puissiez le donner au DatePipe pour l'instancier correctement.
Faire de DatePipe un fournisseur
Dans votre module d'application, vous pouvez également ajouter DatePipe à votre tableau de fournisseurs comme ceci:
import { DatePipe } from '@angular/common';
@NgModule({
providers: [
DatePipe
]
})
Maintenant, vous pouvez simplement l'injecter dans votre constructeur si nécessaire (comme dans la réponse de cexbrayat).
Résumé:
L'une ou l'autre solution a fonctionné, je ne sais pas quel angulaire considérerait le plus "correct" mais j'ai choisi de l'instancier manuellement car angulaire ne fournissait pas de datepipe en tant que fournisseur lui-même.