web-dev-qa-db-ja.com

angular2 ngbdatepicker-入力フィールドで日付をフォーマットする方法

使っています ng-bootstrap日付ピッカー 。モデルである入力フィールドに表示される日付をフォーマットしたいです。 APIを見て、多くの説明なしでNgbDateParserFormatter以外の例を見つけられませんでした:(

Angular 1では、属性format="MM/dd/yyyy"。誰でも助けることができますか?

10
d-man

issue を作成し、そこで回答を得ました。

4
d-man

「デフォルトでは、datepickerには、ISO形式の日付のみを受け入れるこのインターフェイスの基本実装が付属しています。別の形式(または複数の形式)を処理する場合は、NgbDateParserFormatterの独自の実装を提供し、プロバイダーとして登録できますモジュールで。」 ソース

this GitHub Gist に実装例があります。そのソースからのコピーは次のとおりです。

app.component.ts

import { NgbDatepickerConfig, NgbDateParserFormatter } from '@ng-bootstrap/ng-bootstrap';
import { NgbDateFRParserFormatter } from "./ngb-date-fr-parser-formatter"

@Component({
    providers: [{provide: NgbDateParserFormatter, useClass: NgbDateFRParserFormatter}]
})
export class AppComponent {}

ngb-date-fr-parser-formatter.ts

import { Injectable } from "@angular/core";
import { NgbDateParserFormatter, NgbDateStruct } from "@ng-bootstrap/ng-bootstrap";

function padNumber(value: number) {
    if (isNumber(value)) {
        return `0${value}`.slice(-2);
    } else {
        return "";
    }
}

function isNumber(value: any): boolean {
    return !isNaN(toInteger(value));
}

function toInteger(value: any): number {
    return parseInt(`${value}`, 10);
}


@Injectable()
export class NgbDateFRParserFormatter extends NgbDateParserFormatter {
    parse(value: string): NgbDateStruct {
        if (value) {
            const dateParts = value.trim().split('/');
            if (dateParts.length === 1 && isNumber(dateParts[0])) {
                return {year: toInteger(dateParts[0]), month: null, day: null};
            } else if (dateParts.length === 2 && isNumber(dateParts[0]) && isNumber(dateParts[1])) {
                return {year: toInteger(dateParts[1]), month: toInteger(dateParts[0]), day: null};
            } else if (dateParts.length === 3 && isNumber(dateParts[0]) && isNumber(dateParts[1]) && isNumber(dateParts[2])) {
                return {year: toInteger(dateParts[2]), month: toInteger(dateParts[1]), day: toInteger(dateParts[0])};
            }
        }   
        return null;
    }

    format(date: NgbDateStruct): string {
        let stringDate: string = ""; 
        if(date) {
            stringDate += isNumber(date.day) ? padNumber(date.day) + "/" : "";
            stringDate += isNumber(date.month) ? padNumber(date.month) + "/" : "";
            stringDate += date.year;
        }
        return stringDate;
    }
}
17
Javan R.