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": {}
}
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' }
}
From Angular2 DatePipe API Documentation.
"this pipe uses the Internationalization API. Therefore it is only reliable in Chrome and Opera browsers.
If you are okay with showing AM/PM instead of 24 hour time, another valid workaround is to break the formatting into two, and use shortTime
or mediumTime
for displaying the time portion:
{{dto.LastExecution | date:'yyyy-MM-dd'}} {{dto.LastExecution | date:'shortTime'}}
This should work in all major browsers, including IE and Edge.
Regarding the answer from @mark-hughes above, from the moment API documentation:
date_expression | date[:format]
expression is a date object or a number (milliseconds since UTC epoch) or an ISO string
So the value should be any type, and you can use moment().isValid()
to check the value type
@Pipe({name: 'datex'})
export class DatexPipe implements PipeTransform {
transform(value: any, format: string = ""): string {
return moment(value).isValid()? moment(value).format(format) : value;
}
}
Work in Angular 5.x
In version 5.x of the Angular this problem is working correctly in Edge (v.38.14393.1066.0) and in IE (v.11.1198.14393.0), test in your version!
Live example: Plunker Angular 5.x
Related issue that solved the problem (if I found something inconsistent): https://github.com/angular/angular/issues/9524
Answer that involves the entire operation of the Angular DatePipe.
The below solution works fine in for IE11 and chrome. No need to create custom pipes.
{{dto.createdTimeLocal | date:'dd MMM yyyy'}} {{dto.createdTimeLocal | date:'shortTime'}}
moment.js pipes for Angular
Marks answer is great and it was what I was using till I found this simple solution that is well documented.
This module works with Angular 2.0 and above.
No need to write format like this {{date:dd/MM/yyyy hh:mm:ss a}}
.
IE11 or EDGE getting issue with this format only.
Here are some alternatives:
Ex 1: new date and time:
var date = new Date().toLocaleDateString();
var time = new Date().toLocaleTimeString();
var datetime = date + " " + time;
Ex 2: Already you have a datetime
and you want to convert. see below:
datetime = "3/23/2018 11:43:51 AM"
We can split the date and time.
var date = new Date(datetime).toLocaleDateString();
var time = new Date(datetime).toLocaleTimeString();
var splitdatetime = date + " " + time;
This is Angular4. it work fine for all browsers.
来源:https://stackoverflow.com/questions/39728481/angular2-date-pipe-does-not-work-in-ie-11-and-edge-13-14