Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Angular2 date pipe does not work in IE 11 and edge 13/14

I'm using Angular 2.0 final, and I have an incorrect format of dates when I add hours and minutes in the format string:

In the template of the component, I have:

<th id="lastexecution">{{dto.LastExecution | date:'yyyy-MM-dd HH:mm:ss'}}</th> 

The output date in IE 11 is:

2016-09-27 15:00:9/27/2016 3:53:46 PM:9/27/2016 3:53:46 PM 

With {{dto.LastExecution | date:'yyyy-MM-dd'}}

The output date in IE 11 is correct:

2016-09-27 

Here is the components version I use in the package.json:

{   "name": "ima_sentinel",   "version": "1.0.0",   "description": "QuickStart package.json from the documentation, supplemented with testing support",   "scripts": {     "start": "tsc && concurrently \"tsc -w\" \"lite-server\" ",     "docker-build": "docker build -t ima_sentinel .",     "docker": "npm run docker-build && docker run -it --rm -p 3000:3000 -p 3001:3001 ima_sentinel",     "pree2e": "npm run webdriver:update",     "e2e": "tsc && concurrently \"http-server -s\" \"protractor protractor.config.js\" --kill-others --success first",     "lint": "tslint ./app/**/*.ts -t verbose",     "lite": "lite-server",     "postinstall": "typings install",     "test": "tsc && concurrently \"tsc -w\" \"karma start karma.conf.js\"",     "test-once": "tsc && karma start karma.conf.js --single-run",     "tsc": "tsc",     "tsc:w": "tsc -w",     "typings": "typings",     "webdriver:update": "webdriver-manager update"   },   "keywords": [],   "author": "",   "license": "ISC",   "dependencies": {     "@angular/common": "2.0.0",     "@angular/compiler": "2.0.0",     "@angular/core": "2.0.0",     "@angular/forms": "2.0.0",     "@angular/http": "2.0.0",     "@angular/platform-browser": "2.0.0",     "@angular/platform-browser-dynamic": "2.0.0",     "@angular/router": "3.0.0",     "@angular/upgrade": "2.0.0",     "angular2-in-memory-web-api": "0.0.20",     "bootstrap": "^3.3.6",     "core-js": "^2.4.1",     "linqts": "^1.6.0",     "reflect-metadata": "^0.1.3",     "rxjs": "5.0.0-beta.12",     "signalr": "^2.2.1",     "systemjs": "0.19.27",     "typescript-collections": "^1.1.9",     "zone.js": "^0.6.23"   },   "devDependencies": {     "concurrently": "^2.2.0",     "lite-server": "^2.2.0",     "typescript": "^2.0.2",     "typings": "^1.0.4",     "canonical-path": "0.0.2",     "http-server": "^0.9.0",     "tslint": "^3.7.4",     "lodash": "^4.11.1",     "jasmine-core": "~2.4.1",     "karma": "^1.2.0",     "karma-chrome-launcher": "^0.2.3",     "karma-cli": "^0.1.2",     "karma-htmlfile-reporter": "^0.2.2",     "karma-jasmine": "^0.3.8",     "protractor": "^3.3.0",     "rimraf": "^2.5.2"   },   "repository": {} } 
like image 638
Anthony Brenelière Avatar asked Sep 27 '16 15:09

Anthony Brenelière


People also ask

What is the right way to convert format of date using Date pipe in angular?

You have to pass the locale string as an argument to DatePipe. var ddMMyyyy = this. datePipe. transform(new Date(),"dd-MM-yyyy");


1 Answers

UPDATE - The Angular issue that causes this issue is resolved in Angular 5. If you can, I would recommend using that to avoid this problem.

If you are still using Angular 4 or older - as a workaround, I created a pipe to use the moment formatter instead of the Angular built-in one:

import { Pipe, PipeTransform } from '@angular/core'; import * as moment from 'moment';  @Pipe({     name: 'datex' })  export class DatexPipe implements PipeTransform {     transform(value: any, format: string = ""): string {         // Try and parse the passed value.         var momentDate = moment(value);          // If moment didn't understand the value, return it unformatted.         if (!momentDate.isValid()) return value;          // Otherwise, return the date formatted as requested.         return momentDate.format(format);     } } 

Which can then be used:

{{exampleDate | datex:'DD/MM/YYYY HH:mm:ss'}} 

The date you pass in should be something which moment can parse (see the relevant moment documentation) and the format string is a moment, not angular, date formatting string, as documented here.

I've tested this in IE11, Chrome and Firefox and it behaves consistently.

You'll need to ensure moment is added to your package.json as a dependency, e.g.:

{   "name": "demo",   "version": "0.0.1",   // snip   "dependencies": {     // snip     "moment": "^2.15.1",     // snip   },   "devDependencies": {     //snip   } } 

... and ensure your systemjs.config.js is updated so it can locate moment:

map: {    'moment': 'npm:moment'  }  packages: {    moment: { main: './moment.js', defaultExtension: 'js' }  } 
like image 154
Mark Hughes Avatar answered Sep 21 '22 00:09

Mark Hughes