Formattare la data come gg / MM / aaaa usando le pipe


257

Sto usando la datepipe per formattare la mia data, ma non riesco proprio a ottenere il formato esatto che voglio senza una soluzione alternativa. Sto capendo le pipe in modo errato o semplicemente non è possibile?

//our root app component
import {Component} from 'angular2/core'

@Component({
  selector: 'my-app',
  providers: [],
  template: `
    <div>
      <h2>Hello {{name}}</h2>
      <h3>{{date | date: 'ddMMyyyy'}}, should be 
      {{date | date: 'dd'}}/{{date | date:'MM'}}/{{date | date: 'yyyy'}}</h3>

    </div>
  `,
  directives: []
})
export class App {
  constructor() {
    this.name = 'Angular2'
    this.date = new Date();
  }
}

vista plnkr


2
La datepipe ha attualmente diversi problemi.
Günter Zöchbauer,

Questo candidato alla release si sente ancora un po 'incompiuto. Questo è il secondo problema che mi sono imbattuto in 2 giorni .. speriamo che lo risolvano presto. Creare le tue pipe per questa è un'opzione, ma sembra un po 'una duplicazione .. e puoi rimuoverla in pochi mesi ..
Maarten Kieft



Risposte:


466

Bug nel formato della data della pipe corretto in Angular 2.0.0-rc.2, questa richiesta pull .

Ora possiamo fare in modo convenzionale:

{{valueDate | date: 'dd/MM/yyyy'}}

Esempi:

Versione attuale:

Example Angular 8.x.x


Vecchie versioni:

Example Angular 7.x

Example Angular 6.x

Example Angular 4.x

Example Angular 2.x


Maggiori informazioni nella documentazione DatePipe


1
grazie, vorrei solo aggiungere ulteriori suggerimenti per il problema del formato IE11 ++, cfr. stackoverflow.com/questions/39728481/...
boly38

In Angular 5 questo è stato apparentemente risolto @ boly38, segui l'aggiornamento in risposta. E la mia risposta alla domanda collegata: stackoverflow.com/a/46218711/2290538
Fernando Leal

Ricevo la data dall'API come dob: "2019-02-05 00:00:00". Voglio rimuovere 00:00:00 e ho un modello guidato in forma angolare 6. Il mio campo di input è indicato qui. <input #dob="ngModel" [(ngModel)]="model.dob" [ngClass]="{ 'is-invalid': f.submitted && dob.invalid }" class="form-control" id="dob" name="dob" required type="date" /> come posso risolvere questo?
Denuka,

@FernandoLeal - Questo è fantastico. Grazie per questo.
Josh,

questo non sarà traducibile.
Aamer Shahzad,

86

Importa DatePipe da angolare / comune e quindi utilizza il codice seguente:

var datePipe = new DatePipe();
    this.setDob = datePipe.transform(userdate, 'dd/MM/yyyy');

dove userdate sarà la tua stringa della data. Vedi se questo aiuta.

Prendi nota delle lettere minuscole per data e anno:

d- date
M- month
y-year

MODIFICARE

Devi passare la localestringa come argomento a DatePipe, nell'ultima angolare. Ho testato in 4.x angolare

Per esempio:

var datePipe = new DatePipe('en-US');

Questo, per qualche motivo, sembra essere molto pesante. Stiamo facendo la stessa cosa (sul rilevamento delle modifiche) e stiamo impiegando il 75% del tempo di esecuzione della nostra app
sixtyfootersdude,

7
Con angolare 2.1.1, questo errore è gettato Supplied parameters do not match any signature of call target.sunew DatePipe()
saiy2k

6
Puoi usare qualcosa del tiponew DatePipe('en-US');
Chad Kuehn,

Ciao, voglio questo stesso formato in angular2 come il 26 gennaio, (non voglio anno) come?
yala ramesh,

HIPrashanth, visualizzo l'errore "Rifiuto promessa non gestita: nessun provider per DatePipe! '.
MMR

19

Puoi ottenerlo usando una semplice pipe personalizzata.

import { Pipe, PipeTransform } from '@angular/core';
import { DatePipe } from '@angular/common';

@Pipe({
    name: 'dateFormatPipe',
})
export class dateFormatPipe implements PipeTransform {
    transform(value: string) {
       var datePipe = new DatePipe("en-US");
        value = datePipe.transform(value, 'dd/MM/yyyy');
        return value;
    }
}


{{currentDate | dateFormatPipe }}

Il vantaggio di utilizzare una pipe personalizzata è che, se si desidera aggiornare il formato della data in futuro, è possibile andare ad aggiornare la pipe personalizzata e si rifletterà ovunque.

Esempi di tubi personalizzati


14

Uso sempre Moment.js quando devo utilizzare le date per qualsiasi motivo.

Prova questo:

import { Pipe, PipeTransform } from '@angular/core'
import * as moment from 'moment'

@Pipe({
   name: 'formatDate'
})
export class DatePipe implements PipeTransform {
   transform(date: any, args?: any): any {
     let d = new Date(date)
     return moment(d).format('DD/MM/YYYY')

   }
}

E nella vista:

<p>{{ date | formatDate }}</p>

8
momentla libreria è troppo grande per un piccolo lavoro come il formato!
Al-Mothafar,

@Oriana, bella risposta. Lo uso in questo modo; item.deferredStartDate = item.deferredStartDate? moment (item.deferredStartDate) .toDate (): null; È uguale alla tua implementazione.
Kushan Randima,

12

Sto usando questa soluzione temporanea:

import {Pipe, PipeTransform} from "angular2/core";
import {DateFormatter} from 'angular2/src/facade/intl';

@Pipe({
    name: 'dateFormat'
})
export class DateFormat implements PipeTransform {
    transform(value: any, args: string[]): any {
        if (value) {
            var date = value instanceof Date ? value : new Date(value);
            return DateFormatter.format(date, 'pt', 'dd/MM/yyyy');
        }
    }
}

Sono nuovo di Angular 2 e non riesco a farlo. L'ho aggiunto nel suo file TS (compilato in js). Ho provato diverse cose tra cui aggiungerlo come provider sul componente app, quindi nel costruttore del mio compoment figlio, ma non sono riuscito a farlo andare. L'errore è; "Impossibile trovare la pipe 'dateFormat'". Potete darmi una rapida panoramica di come implementarlo, per favore. Ecco i pacchetti che sto usando "dipendenze": {"angular2": "2.0.0-beta.17", "systemjs": "0.19.25", "es6-shim": "^ 0.35.0", " reflection-metadata ":" 0.1.2 "," rxjs ":" 5.0.0-beta.2 "," zone.js ":" 0.6.10 "},
Craig B,

Puoi per favore spingere il tuo codice che farò la correzione. Si prega di utilizzare l'ultima versione di angular2
Deepak

@Deepakrao Che cos'è 'pt' qui? E come posso chiamare questa pipe nel mio componente? come let date = new DateFormat (). transform (input); Per favore, correggimi. E se volessi visualizzare hh: mm, ovvero il tempo
Protagonista il

11

Se qualcuno guarda con il tempo e il fuso orario, questo è per te

 {{data.ct | date :'dd-MMM-yy h:mm:ss a '}}

aggiungi z per il fuso orario alla fine della data e il formato dell'ora

 {{data.ct | date :'dd-MMM-yy h:mm:ss a z'}}

7

Angolare: 8.2.11

<td>{{ data.DateofBirth | date }}</td>

Uscita: 9 giugno 1973

<td>{{ data.DateofBirth | date: 'dd/MM/yyyy' }}</td>

Uscita: 09/06/1973

<td>{{ data.DateofBirth | date: 'dd/MM/yyyy hh:mm a' }}</td>

Uscita: 09/06/1973 12:00 AM


Il secondo e il terzo esempio sono gli stessi e generano output diversi?
Jp_

5

L'unica cosa che ha funzionato per me è stata ispirata da qui: https://stackoverflow.com/a/35527407/2310544

Per puro gg / MM / aaaa, questo ha funzionato per me, con angular 2 beta 16:

{{ myDate | date:'d'}}/{{ myDate | date:'MM'}}/{{ myDate | date:'y'}}

questo è un trucco abbastanza leggibile per le versioni beta, non so perché sia ​​stato ridimensionato ma lo riporterò a zero;)
Sam Vloeberghs

5

Se qualcuno può cercare di visualizzare la data con l'ora in AM o PM in angolare 6, questo è per te.

{{date | date: 'dd/MM/yyyy hh:mm a'}}

Produzione

inserisci qui la descrizione dell'immagine

Opzioni di formato predefinite

Esempi sono riportati nelle impostazioni internazionali en-US.

'short': equivalent to 'M/d/yy, h:mm a' (6/15/15, 9:03 AM).
'medium': equivalent to 'MMM d, y, h:mm:ss a' (Jun 15, 2015, 9:03:01 AM).
'long': equivalent to 'MMMM d, y, h:mm:ss a z' (June 15, 2015 at 9:03:01 AM GMT+1).
'full': equivalent to 'EEEE, MMMM d, y, h:mm:ss a zzzz' (Monday, June 15, 2015 at 9:03:01 AM GMT+01:00).
'shortDate': equivalent to 'M/d/yy' (6/15/15).
'mediumDate': equivalent to 'MMM d, y' (Jun 15, 2015).
'longDate': equivalent to 'MMMM d, y' (June 15, 2015).
'fullDate': equivalent to 'EEEE, MMMM d, y' (Monday, June 15, 2015).
'shortTime': equivalent to 'h:mm a' (9:03 AM).
'mediumTime': equivalent to 'h:mm:ss a' (9:03:01 AM).
'longTime': equivalent to 'h:mm:ss a z' (9:03:01 AM GMT+1).
'fullTime': equivalent to 'h:mm:ss a zzzz' (9:03:01 AM GMT+01:00).

Link di riferimento



4

Le pipe di data non si comportano correttamente in Angular 2 con Typescript per il browser Safari su MacOS e iOS. Ho affrontato questo problema di recente. Ho dovuto usare js moment qui per risolvere il problema. Menzionando ciò che ho fatto in breve ...

  1. Aggiungi il pacchetto momentpm npm nel tuo progetto.

  2. Sotto xyz.component.html, (nota che startDateTime è di tipo stringa di dati)

{{ convertDateToString(objectName.startDateTime) }}

  1. Sotto xyz.component.ts,

import * as moment from 'moment';

convertDateToString(dateToBeConverted: string) {
return moment(dateToBeConverted, "YYYY-MM-DD HH:mm:ss").format("DD-MMM-YYYY");
}

1
Sarebbe utile se mostrassi il codice che hai usato con momentjs in modo che chiunque volesse provare quella soluzione non dovrà ancora capirlo.
Favoloso

Aggiornato il mio commento con la soluzione. Si prega di controllare.
Nikhil,

3

Puoi trovare ulteriori informazioni sulla pipe della data qui , come i formati.

Se vuoi usarlo nel tuo componente, puoi semplicemente farlo

pipe = new DatePipe('en-US'); // Use your own locale

Ora, puoi semplicemente usare il suo metodo di trasformazione, che sarà

const now = Date.now();
const myFormattedDate = this.pipe.transform(now, 'short');

3

Devi passare la stringa della locale come argomento a DatePipe.

var ddMMyyyy = this.datePipe.transform(new Date(),"dd-MM-yyyy");

Opzioni di formato predefinite:

1.      'short': equivalent to 'M/d/yy, h:mm a' (6/15/15, 9:03 AM).
2.      'medium': equivalent to 'MMM d, y, h:mm:ss a' (Jun 15, 2015, 9:03:01 AM).
3.      'long': equivalent to 'MMMM d, y, h:mm:ss a z' (June 15, 2015 at 9:03:01 AM GMT+1).
4.      'full': equivalent to 'EEEE, MMMM d, y, h:mm:ss a zzzz' (Monday, June 15, 2015 at 9:03:01 AM GMT+01:00).
5.      'shortDate': equivalent to 'M/d/yy' (6/15/15).
6.      'mediumDate': equivalent to 'MMM d, y' (Jun 15, 2015).
7.      'longDate': equivalent to 'MMMM d, y' (June 15, 2015).
8.      'fullDate': equivalent to 'EEEE, MMMM d, y' (Monday, June 15, 2015).
9.      'shortTime': equivalent to 'h:mm a' (9:03 AM).
10. 'mediumTime': equivalent to 'h:mm:ss a' (9:03:01 AM).
11. 'longTime': equivalent to 'h:mm:ss a z' (9:03:01 AM GMT+1).
12. 'fullTime': equivalent to 'h:mm:ss a zzzz' (9:03:01 AM GMT+01:00).

aggiungi datepipe in app.component.module.ts

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import {DatePipe} from '@angular/common';
@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule
  ],
  providers: [
    DatePipe
  ],
  bootstrap: [AppComponent]
})
export class AppModule { }


0

Nel mio caso, utilizzo nel file componente:

import {formatDate} from '@angular/common';

// Use your preferred locale
import localeFr from '@angular/common/locales/fr';
import { registerLocaleData } from '@angular/common';

// ....

displayDate: string;
registerLocaleData(localeFr, 'fr');
this.displayDate = formatDate(new Date(), 'EEEE d MMMM yyyy', 'fr');

E nel file HTML componente

<h1> {{ displayDate }} </h1>

Funziona bene per me ;-)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.