371

I'm using the date pipe to format my date, but I just can't get the exact format I want without a workaround. Am I understanding pipes wrongly or is just not possible?

//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();
  }
}

plnkr view

Alexander Abakumov
  • 13,617
  • 16
  • 88
  • 129
Jp_
  • 5,973
  • 4
  • 25
  • 36
  • 2
    The `date` pipe has several issues currently. – Günter Zöchbauer Mar 02 '16 at 17:53
  • This release candidate still feels a little bit unfinished. This is the second issue I stumbled in 2 days.. hopefully they will fix it soon. Creating your own pipes for this is option, but it feels a bit like duplication.. and you can remove it in a few months.. – Maarten Kieft May 31 '16 at 19:10
  • Possible duplicate of [How to set locale in DatePipe in Angular2?](http://stackoverflow.com/questions/34904683/how-to-set-locale-in-datepipe-in-angular2) – nsbm Jan 26 '17 at 12:05
  • formats: https://angular.io/api/common/DatePipe – Rusty Rob Jun 22 '17 at 10:01

17 Answers17

671

Pipe date format bug fixed in Angular 2.0.0-rc.2, this Pull Request.

Now we can do the conventional way:

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

Examples:

Current Version:

Example Angular 13


Old Versions:

Example Angular 8.x.x

Example Angular 7.x

Example Angular 6.x

Example Angular 4.x

Example Angular 2.x


More info in documentation DatePipe

Fernando Leal
  • 9,875
  • 4
  • 24
  • 46
  • 1
    thanks, just would like to append additional tips for IE11++ format issue, cf. https://stackoverflow.com/questions/39728481/angular2-date-pipe-does-not-work-in-ie-11-and-edge-13-14 – boly38 Jun 28 '17 at 08:59
  • In Angular 5 this was apparently solved @boly38, follow the update in answer. And my answer in question linked: https://stackoverflow.com/a/46218711/2290538 – Fernando Leal Sep 14 '17 at 12:15
  • I'm getting date from API as dob: "2019-02-05 00:00:00" . I want to remove 00:00:00 and I have a template driven form in angular 6. My input field is given here. ` ` how can I fix this ? – Denuka Feb 05 '19 at 07:08
  • this will not be translateable. – Aamer Shahzad Feb 12 '20 at 15:52
  • @AamerShahzad, what do you mean by "translateable"? I don't think I understood your question. – Fernando Leal Feb 12 '20 at 20:55
  • date: 'medium' works in angular 10, it will give you something like this - May 20, 2021, 11:28:53 PM – Mike May 21 '21 at 11:32
  • 1
    Thanks! It's working on Angular 14.1.0 – debugger Sep 19 '22 at 17:21
103

Import DatePipe from angular/common and then use the below code:

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

where userdate will be your date string. See if this helps.

Make note of the lowercase for date and year :

d - date
M - month
y - year

EDIT

You have to pass locale string as an argument to DatePipe, in latest angular. I have tested in angular 4.x

For Example:

var datePipe = new DatePipe('en-US');
pjpscriv
  • 866
  • 11
  • 20
Prashanth
  • 1,235
  • 2
  • 12
  • 13
30

You can achieve this using by a simple custom pipe.

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

Template:

{{currentDate | dateFormatPipe }}

Advantage of using a custom pipe is that, if you want to update the date format in future, you can go and update your custom pipe and it will reflect every where.

Custom Pipe examples

pjpscriv
  • 866
  • 11
  • 20
Prashobh
  • 9,216
  • 15
  • 61
  • 91
21

Angular: 8.2.11

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

Output: Jun 9, 1973

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

Output: 09/06/1973

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

Output: 09/06/1973 12:00 AM

14

UPDATE:

Given Moment.js has been deprecated, this answer is not valid anymore. Currently, when I have to format some date, depending on the task, I use Javascript Date or date-fns is a good replacement for Moment.js date calculations (adding or removing days to dates, and so on...).

DO NOT USE THIS:

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

And in the view:

{{ date | formatDate }}

Oriana Ruiz
  • 591
  • 5
  • 8
14

You have to pass the locale string as an argument to DatePipe.

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

Pre-defined format options:

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

add 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 { }
Martijn Pieters
  • 1,048,767
  • 296
  • 4,058
  • 3,343
Tienanhvn
  • 239
  • 5
  • 9
13

If anyone looking with time and timezone, this is for you

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

add z for time zone at the end of date and time format

 {{data.ct | date :'dd-MMM-yy h:mm:ss a z'}}
ULLAS K
  • 881
  • 2
  • 11
  • 24
12

I am using this Temporary Solution:

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');
        }
    }
}
Amir
  • 8,821
  • 7
  • 44
  • 48
Deepak
  • 1,373
  • 2
  • 10
  • 31
  • I'm new to angular 2 and am having trouble getting this going. I added it in it's own TS file (compiled to js). I tried several things including adding it as a provider on app component then in the constructor of my child compoment but I couldn't get it to go. Error is; "The pipe 'dateFormat' could not be found". Can you give me a quick overview of how to implement this please. Here's the packages I'm using "dependencies": {"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 May 17 '16 at 21:10
  • Can you please plunker you code i will make correction. Please use latest version of angular2 – Deepak May 18 '16 at 05:04
  • @Deepakrao What is 'pt' here? And how do I call this pipe in my component? like let date=new DateFormat().transform(input); Please correct me. And what if I want to display hh:mm, i.e time – Protagonist Feb 26 '17 at 08:33
9

If anyone can looking to display date with time in AM or PM in angular 6 then this is for you.

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

Output

enter image description here

Pre-defined format options

Examples are given in en-US locale.

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

Reference Link

Ahmer Ali Ahsan
  • 5,636
  • 16
  • 44
  • 81
7

You can find more information about the date pipe here, such as formats.

If you want to use it in your component, you can simply do

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

Now, you can simply use its transform method, which will be

const now = Date.now();
const myFormattedDate = this.pipe.transform(now, 'short');
Yushin
  • 1,684
  • 3
  • 20
  • 36
6

The only thing that worked for me was inspired from here: https://stackoverflow.com/a/35527407/2310544

For pure dd/MM/yyyy, this worked for me, with angular 2 beta 16:

{{ myDate | date:'d'}}/{{ myDate | date:'MM'}}/{{ myDate | date:'y'}}
Community
  • 1
  • 1
Johan Chouquet
  • 427
  • 6
  • 13
5

Date pipes does not behave correctly in Angular 2 with Typescript for Safari browser on MacOS and iOS. I faced this issue recently. I had to use moment js here for resolving the issue. Mentioning what I have done in short...

  1. Add momentjs npm package in your project.

  2. Under xyz.component.html, (Note here that startDateTime is of data type string)

{{ convertDateToString(objectName.startDateTime) }}

  1. Under xyz.component.ts,

import * as moment from 'moment';

convertDateToString(dateToBeConverted: string) {
return moment(dateToBeConverted, "YYYY-MM-DD HH:mm:ss").format("DD-MMM-YYYY");
}
Nikhil
  • 861
  • 11
  • 15
  • 1
    It would help if you showed the code that you used with momentjs so that anyone who wanted to try that solution won't have to still figure it out. – Fabulous Apr 07 '18 at 18:50
  • Updated my comment with solution. Please check. – Nikhil Nov 09 '18 at 08:16
4

I think that it's because the locale is hardcoded into the DatePipe. See this link:

And there is no way to update this locale by configuration right now.

jake
  • 488
  • 10
  • 19
Thierry Templier
  • 198,364
  • 44
  • 396
  • 360
4

In my case, I use in component file:

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

And in the component HTML file

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

It works fine for me ;-)

Sébastien REMY
  • 2,399
  • 21
  • 39
3

It might be obvious to some, but if you want to have this date format

01.07.2022 (common in e.g. Germany)

you can simply do this:

{{ myDate | date: "dd.MM.yyyy" }}
MikhailRatner
  • 452
  • 6
  • 13
1

You can also use momentjs for this sort of things. Momentjs is best at parse, validate, manipulate, and display dates in JavaScript.

I used this pipe from Urish, which works fine for me:

https://github.com/urish/angular2-moment/blob/master/src/DateFormatPipe.ts

In the args parameter you can put your date format like: "dd/mm/yyyy"

Doek
  • 161
  • 9
0

In my case, I was using a date string of format dd/MM/yyyy and was trying to convert it into a different format.

And this error struck me InvalidPipeArgument.

After some googling, I found that the date string should be in the ISO-recognized format.

laplace
  • 656
  • 7
  • 15