使用管道将日期格式设置为dd / MM / yyyy


257

我正在使用date管道设置日期格式,但是如果没有解决方法,我将无法获得所需的确切格式。我是错误地理解管道还是只是不可能?

//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视图


2
date管道当前有几个问题。
君特Zöchbauer

这个候选发布者仍然感到有些未完成。这是我两天后迷失的第二个问题。希望他们能尽快解决。创建你自己的管材这是选项,但感觉有点像复制..你可以在几个月内将其删除..
马腾基夫特



Answers:


466

管道日期格式错误已在Angular 2.0.0-rc.2(此Pull Request)中修复。

现在我们可以按照常规方式进行操作:

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

例子:

当前版本:

Example Angular 8.x.x


旧版本:

Example Angular 7.x

Example Angular 6.x

Example Angular 4.x

Example Angular 2.x


文档中的更多信息 DatePipe


1
谢谢,只想为IE11 ++格式问题附加其他提示,请参见。stackoverflow.com/questions/39728481/…–
boly38

在Angular 5中,这显然已通过@ boly38解决,请在更新中关注。我的问题答案已链接:stackoverflow.com/a/46218711/2290538
Fernando Leal

我从API获取日期为dob:“ 2019-02-05 00:00:00”。我想删除00:00:00,并且有一个角度为6的模板驱动形式。我的输入字段在此处给出。<input #dob="ngModel" [(ngModel)]="model.dob" [ngClass]="{ 'is-invalid': f.submitted && dob.invalid }" class="form-control" id="dob" name="dob" required type="date" /> 我怎样才能解决这个问题 ?
Denuka '19

@FernandoLeal-这太神奇了。谢谢你
乔什(Josh)

这将是不可翻译的。
Aamer Shahzad

86

从angular / common导入DatePipe,然后使用以下代码:

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

其中 userdate 将是您的日期字符串。看看是否有帮助。

记下日期和年份的小写字母:

d- date
M- month
y-year

编辑

您必须以locale最新的角度将字符串作为参数传递给DatePipe。我已经在angular 4.x中测试过

例如:

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

由于某种原因,这似乎很沉重。我们正在做同样的事情(关于更改检测),它占用了我们应用程序执行时间的75%
sixtyfootersdude

7
具有角2.1.1,这个错误被扔Supplied parameters do not match any signature of call target.new DatePipe()
saiy2k

6
您可以使用类似new DatePipe('en-US');
乍得·库恩

嗨,我想在angular2中使用相同的格式,例如1月26日,(我不想年份)如何?
yala ramesh

HIPrashanth,我收到错误消息:“未处理的承诺被拒绝:DatePipe没有提供者!'。
MMR

19

您可以通过一个简单的自定义管道来实现。

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

使用自定义管道的优势在于,如果您将来想更新日期格式,则可以去更新您的自定义管道,它会反映所有位置。

自定义管道示例


14

当出于任何原因需要使用日期时,我总是使用Moment.js。

试试这个:

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

   }
}

并在视图中:

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

8
moment库对于格式之类的小任务来说太大了!
Al-Mothafar

@Oriana,好答案。我用这种方式;item.deferredStartDate = item.deferredStartDate?moment(item.deferredStartDate).toDate():null; 它与您的实现完全相同。
Kushan Randima

12

我正在使用此临时解决方案:

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

我是Angle 2的新手,现在很难解决这个问题。我将其添加到它自己的TS文件中(编译为js)。我尝试了几件事,包括将其添加为应用程序组件上的提供程序,然后添加到我的子组件的构造函数中,但我无法解决它。错误是;“找不到管道'dateFormat'”。您能否简要介绍一下如何实现此功能。这是我使用的“依赖项”软件包:{“ angular2”:“ 2.0.0-beta.17”,“ systemjs”:“ 0.19.25”,“ es6-shim”:“ ^ 0.35.0”,“反射元数据”:“ 0.1.2”,“ rxjs”:“ 5.0.0-beta.2”,“ zone.js”:“ 0.6.10”},
Craig B

您能帮我打个招呼吗,我会改正。请使用最新版本的angular2
Deepak

@Deepakrao这里的“ pt”是什么?以及如何在我的组件中调用此管道?像let date = new DateFormat()。transform(input); 请纠正我。如果我想显示hh:mm,即时间,该怎么办
主角

11

如果有人在找时间和时区,这是给你的

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

在日期和时间格式的末尾为时区添加z

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

7

角度:8.2.11

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

输出: 1973年6月9日

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

输出: 1973/09/06

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

输出: 1973年9月6日上午12:00


第二个和第三个示例相同,并且生成不同的输出吗?
Jp_

5

唯一对我有用的东西是从这里得到启发的:https//stackoverflow.com/a/35527407/2310544

对于纯dd / MM / yyyy,这对我有用,角度为2 beta 16:

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

对于beta版来说,这是一个非常容易理解的hack,不知道为什么它被否决了,但我将其归零;)
Sam Vloeberghs

5

如果任何人都希望以角度6以AM或PM显示带有时间的日期,那么这很适合您。

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

输出量

在此处输入图片说明

预定义格式选项

示例在美国语言环境中给出。

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

参考链接



4

在MacOS和iOS上的Safari浏览器中,日期管道在带有Typescript的Angular 2中无法正常运行。我最近遇到了这个问题。我不得不在这里使用moment js来解决问题。简短地说一下我做了什么...

  1. 在您的项目中添加momentjs npm软件包。

  2. 在xyz.component.html下,(请注意,startDateTime的数据类型为字符串)

{{ convertDateToString(objectName.startDateTime) }}

  1. 在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
如果您显示了与momentjs一起使用的代码,这将有所帮助,从而使任何想要尝试该解决方案的人都不必再弄清楚它。
很棒

用解决方案更新了我的评论。请检查。
Nikhil

3

您可以在此处找到有关日期管道的更多信息,例如格式。

如果要在组件中使用它,只需执行

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

现在,您可以简单地使用其transform方法,即

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

3

您必须将语言环境字符串作为参数传递给DatePipe。

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

预定义格式选项:

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

在app.component.module.ts中添加datepipe

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

就我而言,我在组件文件中使用:

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

并在组件HTML文件中

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

这对我来说可以 ;-)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.