Formatee la fecha como dd / MM / aaaa utilizando tuberías


257

Estoy usando la datetubería para formatear mi fecha, pero simplemente no puedo obtener el formato exacto que quiero sin una solución. ¿Estoy entendiendo mal las tuberías o simplemente no es posible?

//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 datetubería tiene varios problemas actualmente.
Günter Zöchbauer

Este candidato de lanzamiento todavía se siente un poco inacabado. Este es el segundo problema que encontré en 2 días ... espero que lo solucionen pronto. Crear sus propios tubos para esto es una opción, pero se siente un poco como una duplicación ... y puede eliminarlo en unos pocos meses ...
Maarten Kieft



Respuestas:


467

Error de formato de fecha de tubería solucionado en Angular 2.0.0-rc.2, esta solicitud de extracción .

Ahora podemos hacer de la manera convencional:

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

Ejemplos:

Versión actual:

Example Angular 8.x.x


Versiones antiguas:

Example Angular 7.x

Example Angular 6.x

Example Angular 4.x

Example Angular 2.x


Más información en la documentación. DatePipe


1
gracias, solo me gustaría agregar consejos adicionales para el problema del formato IE11 ++, cf. stackoverflow.com/questions/39728481/…
boly38

En Angular 5 esto aparentemente se resolvió @ boly38, siga la actualización en respuesta. Y mi respuesta en cuestión vinculada: stackoverflow.com/a/46218711/2290538
Fernando Leal

Recibo la fecha de API como dob: "2019-02-05 00:00:00". Quiero eliminar 00:00:00 y tengo un formulario controlado por plantilla en angular 6. Mi campo de entrada se proporciona aquí. <input #dob="ngModel" [(ngModel)]="model.dob" [ngClass]="{ 'is-invalid': f.submitted && dob.invalid }" class="form-control" id="dob" name="dob" required type="date" /> Cómo puedo arreglar esto ?
Denuka

@FernandoLeal - Esto es asombroso. Gracias por esto.
Josh

Esto no será traducible.
Aamer Shahzad

86

Importe DatePipe desde angular / común y luego use el siguiente código:

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

donde userdate será su cadena de fecha. A ver si esto ayuda.

Tome nota de las minúsculas para la fecha y el año:

d- date
M- month
y-year

EDITAR

localeDebe pasar una cadena como argumento a DatePipe, en el último angular. He probado en angular 4.x

Por ejemplo:

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

Esto, por alguna razón, parece ser muy pesado. Estamos haciendo lo mismo (en la detección de cambios) y nos está llevando el 75% del tiempo de ejecución de nuestra aplicación
sixtyfootersdude

77
Con angular 2.1.1, este error se lanza Supplied parameters do not match any signature of call target.ennew DatePipe()
saiy2k

66
Puedes usar algo comonew DatePipe('en-US');
Chad Kuehn

Hola, quiero este mismo formato en angular2 como el 26 de enero, (no quiero año) ¿cómo?
yala ramesh

HIPrashanth, recibo el error 'Rechazo de promesa no controlada: ¡No hay proveedor para DatePipe! '.
MMR

19

Puede lograr esto usando una simple tubería personalizada.

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

La ventaja de usar una tubería personalizada es que, si desea actualizar el formato de fecha en el futuro, puede ir y actualizar su tubería personalizada y se reflejará en todas partes.

Ejemplos de tuberías personalizadas


14

Siempre uso Moment.js cuando necesito usar fechas por cualquier motivo.

Prueba esto:

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')

   }
}

Y a la vista:

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

8
moment¡La biblioteca es demasiado grande para un trabajo pequeño como el formato!
Al-Mothafar

@ Oriana, buena respuesta. Lo uso de esta manera; item.deferredStartDate = item.deferredStartDate? moment (item.deferredStartDate) .toDate (): nulo; Es lo mismo que su implementación.
Kushan Randima

12

Estoy usando esta solución temporal:

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

Soy nuevo en angular 2 y tengo problemas para poner esto en marcha. Lo agregué en su propio archivo TS (compilado a js). Intenté varias cosas, incluyendo agregarlo como proveedor en el componente de la aplicación y luego en el constructor de mi componente hijo, pero no pude hacerlo funcionar. Error es; "No se pudo encontrar la tubería 'dateFormat'". ¿Me puede dar una descripción rápida de cómo implementar esto, por favor? Aquí están los paquetes que estoy usando "dependencias": {"angular2": "2.0.0-beta.17", "systemjs": "0.19.25", "es6-shim": "^ 0.35.0", " reflect-metadata ":" 0.1.2 "," rxjs ":" 5.0.0-beta.2 "," zone.js ":" 0.6.10 "},
Craig B

¿Puede por favor extraer su código? Haré la corrección. Utilice la última versión de angular2
Deepak,

@Deepakrao ¿Qué es 'pt' aquí? ¿Y cómo llamo a este tubo en mi componente? como let date = new DateFormat (). transform (input); Por favor corrigeme. ¿Y si quiero mostrar hh: mm, es decir, hora
Protagonista

11

Si alguien mira con tiempo y zona horaria, esto es para ti

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

agregue z para la zona horaria al final del formato de fecha y hora

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

7

Angular: 8.2.11

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

Salida: 9 de junio de 1973

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

Salida: 06/09/1973

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

Salida: 06/09/1973 12:00 AM


¿El segundo y el tercer ejemplo son iguales y generan resultados diferentes?
Jp_

5

Lo único que funcionó para mí fue inspirado desde aquí: https://stackoverflow.com/a/35527407/2310544

Para dd / MM / aaaa puro, esto funcionó para mí, con angular 2 beta 16:

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

este es un truco bastante legible para las versiones beta, no sé por qué fue rechazado pero lo volveré a poner a cero;)
Sam Vloeberghs

5

Si alguien puede buscar mostrar la fecha con la hora en AM o PM en angular 6, entonces esto es para usted.

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

Salida

ingrese la descripción de la imagen aquí

Opciones de formato predefinidas

Se dan ejemplos en la configuración regional 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 de referencia



4

Las canalizaciones de fecha no se comportan correctamente en Angular 2 con el mecanografiado para el navegador Safari en MacOS e iOS. Me enfrenté a este problema recientemente. Tuve que usar moment js aquí para resolver el problema. Mencionando lo que he hecho en resumen ...

  1. Agregue el paquete momentjs npm en su proyecto.

  2. En xyz.component.html, (tenga en cuenta que startDateTime es de tipo de cadena de datos)

{{ convertDateToString(objectName.startDateTime) }}

  1. En 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
Sería útil si mostraras el código que usaste con momentjs para que cualquiera que quisiera probar esa solución no tenga que resolverlo.
Fabuloso

Actualicé mi comentario con solución. Por favor, compruebe.
Nikhil

3

Puede encontrar más información sobre el tubo de fecha aquí , como los formatos.

Si desea usarlo en su componente, simplemente puede hacer

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

Ahora, simplemente puede usar su método de transformación, que será

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

3

Debe pasar la cadena de configuración regional como argumento a DatePipe.

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

Opciones de formato predefinidas:

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).

agregue datepipe en 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

En mi caso, uso en el archivo 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');

Y en el archivo HTML componente

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

Funciona bien para mí ;-)

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.