Відформатуйте дату як дд / ММ / рррр, використовуючи труби


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труба має кілька питань.
Günter Zöchbauer

Цей кандидат на реліз все ще відчуває себе трохи незавершеним. Це другий випуск, який я натрапив за 2 дні .. сподіваюся, вони скоро його вирішать. Створити власні труби для цього - це варіант, але це трохи схоже на дублювання .. і ви можете видалити його через кілька місяців ..
Maarten Kieft



Відповіді:


466

Помилка формату дати в трубі виправлена ​​в кутовому 2.0.0-rc.2, цей Запит на витяг .

Тепер ми можемо зробити звичайним способом:

{{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
Фернандо Ліал

Я отримую дату від 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

@FernandoLeal - Це дивовижно. Дякую за це
Джош

це не можна перекласти.
Аамер Шахзад

86

Імпортуйте DatePipe з кутового / загального, а потім скористайтеся наведеним нижче кодом:

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

де датою користувача буде ваш рядок дати. Подивіться, чи це допомагає.

Зверніть увагу на малі регістри для дати та року:

d- date
M- month
y-year

EDIT

Ви повинні передати localeрядок як аргумент DatePipe, в останньому кутовому. Я перевірив у куті 4.x

Наприклад:

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

Це чомусь здається дуже важким. Ми робимо те ж саме (при виявленні змін), і це займає 75% часу виконання нашого додатку
шістдесят футів

7
З кутовим 2.1.1 ця помилка накидається Supplied parameters do not match any signature of call target.наnew DatePipe()
saiy2k

6
Ви можете використовувати щось на кшталтnew DatePipe('en-US');
Чад Куен

Привіт, я хочу, щоб цей самий формат у angular2, як 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бібліотека занадто велика для такої невеликої роботи, як формат!
Аль-Мотафар

@Oriana, приємна відповідь. Я використовую це таким чином; item.deferredStartDate = item.deferredStartDate? момент (item.deferredStartDate) .toDate (): null; Це так само, як і ваша реалізація.
Кушань Рандіма

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

Я новачок у кутовому режимі 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'? І як я називаю цю трубу в своєму компоненті? як нехай дата = новий DateFormat (). перетворення (введення); Будь ласка, виправте мене. А що, якщо я хочу відобразити 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>

Вихід: 9 червня 1973 року

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

Вихід: 06.06.1973

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

Вихід: 06.06.1973 12:00


Другий і третій приклад однакові і дають різний вихід?
Jp_

5

Єдине, що працювало для мене, було натхнено звідси: https://stackoverflow.com/a/35527407/2310544

Для чистого dd / MM / yyy, це працювало для мене, з кутовою 2 бета-версією 16:

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

це досить читабельний хак для бета-версій, не знаю, чому це було знято, але я поверну його до нуля;)
Сем Влобергс

5

Якщо хтось може шукати, щоб відобразити дату з часом в AM або PM в кутовій 6, то це для вас.

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

Труби дати не ведуть себе правильно у 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");
}

1
Це допоможе, якби ви показали код, який ви використовували з momentjs, щоб кожен, хто хотів спробувати це рішення, не мав все-таки з'ясувати це.
Казковий

Оновлено мій коментар із рішенням. Будь ласка, перевірте.
Нікхіл

3

Ви можете знайти більше інформації про дату подачі тут , наприклад формати.

Якщо ви хочете використовувати його у своєму компоненті, ви можете просто зробити

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

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

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

додати 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 { }

2

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

Я використав цю трубу від Urish, яка добре працює для мене:

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

У параметрі args ви можете ввести формат дати, наприклад: "dd / mm / yyyy"


посилання розірвано, посилання зараз github.com/urish/angular2-moment/blob/master/src/…
Tony

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>

Це прекрасно працює для мене ;-)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.