Отформатируйте дату как дд / мм / гггг с помощью конвейера

Я использую канал 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


person Jp_    schedule 02.03.2016    source источник
comment
В настоящее время у канала date есть несколько проблем.   -  person Günter Zöchbauer    schedule 02.03.2016
comment
Этот релиз-кандидат все еще кажется немного незаконченным. Это вторая проблема, с которой я столкнулся за 2 дня .. надеюсь, они скоро исправят. Создание собственных каналов для этого - вариант, но это немного похоже на дублирование ... и вы можете удалить его через несколько месяцев ..   -  person Maarten Kieft    schedule 31.05.2016
comment
Возможный дубликат Как установить языковой стандарт в DatePipe в Angular2?   -  person nsbm    schedule 26.01.2017
comment
форматы: angular.io/api/common/DatePipe   -  person robert king    schedule 22.06.2017


Ответы (15)


Ошибка формата даты конвейера исправлена ​​в Angular 2.0.0-rc.2, этом запросе на слияние.

Теперь можно поступить обычным способом:

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

Примеры:

Текущая версия:

Пример Angular 8.xx < / а>


Старые версии:

Пример Angular 7.x < / а>

Пример Angular 6.x < / а>

Пример Angular 4.x

Пример Angular 2.x


Дополнительная информация в документации DatePipe

person Fernando Leal    schedule 20.06.2016
comment
спасибо, просто хотел бы добавить дополнительные советы по проблеме с форматом IE11 ++, ср. stackoverflow.com/questions/39728481/ - person boly38; 28.06.2017
comment
В Angular 5 это, по-видимому, было решено @ boly38, следите за обновлением в ответе. И мой ответ на вопрос связан: stackoverflow.com/a/46218711/2290538 - person Fernando Leal; 14.09.2017
comment
Я получаю дату из API как dob: 2019-02-05 00:00:00. Я хочу удалить 00:00:00, и у меня есть форма, управляемая шаблоном, в angular 6. Мое поле ввода приведено здесь. <input #dob="ngModel" [(ngModel)]="model.dob" [ngClass]="{ 'is-invalid': f.submitted && dob.invalid }" class="form-control" id="dob" name="dob" required type="date" /> как я могу это исправить? - person Denuka; 05.02.2019
comment
@FernandoLeal - Это потрясающе. Спасибо за это. - person Josh; 02.08.2019
comment
это не будет переведено. - person Aamer Shahzad; 12.02.2020
comment
@AamerShahzad, что вы имеете в виду под переводимым? Не думаю, что я понял ваш вопрос. - person Fernando Leal; 12.02.2020
comment
Работал для меня, потрясающее спасибо - person Viplav Soni; 24.04.2021
comment
date: 'medium' работает в angular 10, это даст вам что-то вроде этого - 20 мая 2021 года, 23:28:53 PM - person Mike; 21.05.2021

Импортируйте DatePipe из angular / common, а затем используйте следующий код:

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

где userdate будет вашей строкой даты. Посмотрим, поможет ли это.

Обратите внимание на строчные буквы для даты и года:

d- date
M- month
y-year

ИЗМЕНИТЬ

Вы должны передать строку locale в качестве аргумента DatePipe в последней версии angular. Я тестировал в angular 4.x

Например:

var datePipe = new DatePipe('en-US');
person Prashanth    schedule 16.06.2016
comment
Это почему-то кажется очень тяжелым. Мы делаем то же самое (при обнаружении изменений), и на это уходит 75% времени выполнения нашего приложения. - person sixtyfootersdude; 20.09.2016
comment
В Angular 2.1.1 эта ошибка выдается Supplied parameters do not match any signature of call target. на new DatePipe() - person saiy2k; 15.11.2016
comment
Вы можете использовать что-то вроде new DatePipe('en-US'); - person Chad Kuehn; 15.01.2017
comment
Привет, я хочу такой же формат в angular2, как 26 января (я не хочу в год), как? - person yala ramesh; 04.03.2017
comment
HIPrashanth, я получаю сообщение об ошибке «Отклонение необработанного обещания: нет поставщика для DatePipe! '. - person MMR; 29.03.2017

Вы можете добиться этого, используя простую кастомную трубу.

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

Преимущество использования настраиваемого канала заключается в том, что если вы хотите обновить формат даты в будущем, вы можете пойти и обновить свой настраиваемый канал, и он будет отражать везде.

Примеры пользовательских каналов

person Prashobh    schedule 04.04.2017

Я всегда использую 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>
person Oriana Ruiz    schedule 14.09.2016
comment
moment библиотека слишком велика для такой небольшой работы, как формат! - person Al-Mothafar; 16.08.2017
comment
@Oriana, хороший ответ. Я использую это так; item.deferredStartDate = item.deferredStartDate? момент (item.deferredStartDate) .toDate (): null; Это то же самое, что и ваша реализация. - person Kushan Randima; 23.04.2020

Я использую это временное решение:

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');
        }
    }
}
person Deepak    schedule 12.04.2016
comment
Я новичок в angular 2, и у меня проблемы с этим. Я добавил его в собственный файл TS (скомпилированный в js). Я пробовал несколько вещей, включая добавление его в качестве поставщика в компонент приложения, а затем в конструктор моего дочернего компонента, но я не мог заставить его работать. Ошибка есть; Канал dateFormat не найден. Не могли бы вы дать мне краткий обзор того, как это реализовать? Вот пакеты, которые я использую для зависимостей: {angular2: 2.0.0-beta.17, systemjs: 0.19.25, es6-shim: ^ 0.35.0, reflection-metadata: 0.1.2, rxjs: 5.0.0-beta. .2, zone.js: 0.6.10}, - person Craig B; 18.05.2016
comment
Не могли бы вы перевернуть свой код, я сделаю исправление. Пожалуйста, используйте последнюю версию angular2 - person Deepak; 18.05.2016
comment
@Deepakrao Что здесь "pt"? И как мне назвать этот канал в моем компоненте? например let date = new DateFormat (). transform (input); Пожалуйста, поправьте меня. А что, если я хочу отображать чч: мм, то есть время - person Protagonist; 26.02.2017

Если кто-то смотрит со временем и часовым поясом, это для вас

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

добавить z для часового пояса в конце формата даты и времени

 {{data.ct | date :'dd-MMM-yy h:mm:ss a z'}}
person ULLAS K    schedule 13.06.2018

Угловой: 8.2.11

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

Вывод: 9 июня 1973 г.

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

Вывод: 06.09.1973

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

Вывод: 06.09.1973, 12:00.

person R M Shahidul Islam Shahed    schedule 26.10.2019
comment
Второй и третий пример одинаковы и генерируют разные результаты? - person Jp_; 27.10.2019

Если кто-то может отображать дату со временем в AM или PM в угловом 6, то это для вас.

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

Вывод

введите описание изображения здесь

Стандартные параметры формата

Примеры приведены в локали 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).

Ссылка на ссылку

person Ahmer Ali Ahsan    schedule 17.09.2018

Вы должны передать строку языкового стандарта в качестве аргумента 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).

добавить datepipe в 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 { }
person Tienanhvn    schedule 22.11.2019

Единственное, что сработало для меня, было вдохновлено здесь: https://stackoverflow.com/a/35527407/2310544

Для чистого dd / MM / yyyy это сработало для меня с angular 2 beta 16:

{{ myDate | date:'d'}}/{{ myDate | date:'MM'}}/{{ myDate | date:'y'}}
person Johan Chouquet    schedule 27.04.2016
comment
это довольно читаемый хак для бета-версий, не знаю, почему он был отклонен, но я верну его к нулю;) - person Sam Vloeberghs; 24.06.2016

Я думаю, это потому, что локаль жестко запрограммирована в DatePipe. См. Эту ссылку:

И сейчас нет возможности обновить эту локаль с помощью конфигурации.

person Thierry Templier    schedule 02.03.2016

Дополнительную информацию о канале даты, например о форматах, можно найти здесь.

Если вы хотите использовать его в своем компоненте, вы можете просто сделать

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

Теперь вы можете просто использовать его метод преобразования, который будет

const now = Date.now();
const myFormattedDate = this.pipe.transform(now, 'short');
person Yushin    schedule 04.09.2018

Каналы дат некорректно работают в Angular 2 с Typescript для браузера Safari в MacOS и iOS. Я недавно столкнулся с этой проблемой. Мне пришлось использовать здесь момент 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");
}
person Nikhil    schedule 07.04.2018
comment
Было бы полезно, если бы вы показали код, который вы использовали с momentjs, чтобы всем, кто хочет попробовать это решение, не пришлось бы еще разбираться в нем. - person Fabulous; 07.04.2018
comment
Обновил мой комментарий решением. Пожалуйста, проверьте. - person Nikhil; 09.11.2018

В моем случае я использую в файле компонента:

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>

Он отлично работает для меня ;-)

person Sébastien REMY    schedule 25.10.2019

Вы также можете использовать momentjs для такого рода вещей. Momentjs лучше всего подходит для синтаксического анализа, проверки, управления и отображения дат в JavaScript.

Я использовал эту трубку от Urish, которая мне подходит:

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

В параметре args вы можете указать формат даты, например: «дд / мм / гггг».

person Doek    schedule 20.06.2016
comment
ссылка не работает, ссылка теперь github.com/ urish / angular2-moment / blob / master / src / - person Tony; 04.01.2017