ヨーロッパ形式を使用して日付を表示したいのですdd/MM/yyyy
が、DatePipe shortDate形式を使用すると、米国の日付スタイルのみを使用して表示されますMM/dd/yyyy
。
デフォルトのロケールはen_USであると想定しています。ドキュメントにないかもしれませんが、Angular2アプリのデフォルトのロケール設定を変更するにはどうすればよいですか?または、カスタム形式をDatePipeに渡す方法はありますか?
ヨーロッパ形式を使用して日付を表示したいのですdd/MM/yyyy
が、DatePipe shortDate形式を使用すると、米国の日付スタイルのみを使用して表示されますMM/dd/yyyy
。
デフォルトのロケールはen_USであると想定しています。ドキュメントにないかもしれませんが、Angular2アプリのデフォルトのロケール設定を変更するにはどうすればよいですか?または、カスタム形式をDatePipeに渡す方法はありますか?
回答:
Angular2 RC6以降では、プロバイダーを追加することで、アプリモジュールにデフォルトのロケールを設定できます。
@NgModule({
providers: [
{ provide: LOCALE_ID, useValue: "en-US" }, //replace "en-US" with your locale
//otherProviders...
]
})
通貨/日付/数値パイプはロケールを取得する必要があります。LOCALE_IDはOpaqueTokenで、angular / coreからインポートされます。
import { LOCALE_ID } from '@angular/core';
より高度なユースケースでは、サービスからロケールを取得することができます。日付パイプを使用するコンポーネントが作成されると、ロケールが解決されます(1回)。
{
provide: LOCALE_ID,
deps: [SettingsService], //some service handling global settings
useFactory: (settingsService) => settingsService.getLanguage() //returns locale string
}
それがあなたのために働くことを願っています。
new CurrencyPipe('en-US');
。これが私の問題をグーグルするときの最初の結果として現れたので、うまくいけばこれは何かのために便利です。
アプリの言語を一度設定する場合は、LOCALE_IDを使用したソリューションが最適です。ただし、実行時に言語を変更する場合は機能しません。この場合、カスタム日付パイプを実装できます。
import { DatePipe } from '@angular/common';
import { Pipe, PipeTransform } from '@angular/core';
import { TranslateService } from '@ngx-translate/core';
@Pipe({
name: 'localizedDate',
pure: false
})
export class LocalizedDatePipe implements PipeTransform {
constructor(private translateService: TranslateService) {
}
transform(value: any, pattern: string = 'mediumDate'): any {
const datePipe: DatePipe = new DatePipe(this.translateService.currentLang);
return datePipe.transform(value, pattern);
}
}
TranslateServiceを使用してアプリの表示言語を変更した場合(ngx-translateを参照)
this.translateService.use('en');
アプリ内のフォーマットは自動的に更新されます。
使用例:
<p>{{ 'note.created-at' | translate:{date: note.createdAt | localizedDate} }}</p>
<p>{{ 'note.updated-at' | translate:{date: note.updatedAt | localizedDate:'fullDate'} }}</p>
angular5
上記の答えは、もはや作品!
次のコード:
app.module.ts
@NgModule({
providers: [
{ provide: LOCALE_ID, useValue: "de-at" }, //replace "de-at" with your locale
//otherProviders...
]
})
次のエラーが発生します:
エラー:ロケール「de-at」のロケールデータがありません。
ではangular5
、あなたは自分で使用するロケールファイルをロードして登録する必要があります。
app.module.ts
import { NgModule, LOCALE_ID } from '@angular/core';
import { registerLocaleData } from '@angular/common';
import localeDeAt from '@angular/common/locales/de-at';
registerLocaleData(localeDeAt);
@NgModule({
providers: [
{ provide: LOCALE_ID, useValue: "de-at" }, //replace "de-at" with your locale
//otherProviders...
]
})
registerLocaleData
で十分だったので、ドキュメントは少し複雑です。
TranslateService
from を使用する場合@ngx-translate/core
、以下は実行時に動的に切り替えることで動作する新しいパイプを作成しないバージョンです(Angular 7でテスト済み)。DatePipeのlocale
パラメーターの使用(docs):
まず、アプリで使用するロケールを宣言します。例app.component.ts
:
import localeIt from '@angular/common/locales/it';
import localeEnGb from '@angular/common/locales/en-GB';
.
.
.
ngOnInit() {
registerLocaleData(localeIt, 'it-IT');
registerLocaleData(localeEnGb, 'en-GB');
}
次に、パイプを動的に使用します。
myComponent.component.html
<span>{{ dueDate | date: 'shortDate' : '' : translateService.currentLang }}</span>
myComponent.component.ts
constructor(public translateService: TranslateService) { ... }
date_pipe.tsを確認しましたが、興味深い2ビットの情報があります。上部に次の2行があります。
// TODO: move to a global configurable location along with other i18n components.
var defaultLocale: string = 'en-US';
下の方に次の行があります。
return DateFormatter.format(value, defaultLocale, pattern);
これは、日付パイプが現在「en-US」にハードコードされていることを示唆しています。
私が間違っていたら教えてください。
app.module.tsに次のインポートを追加します。ここにLOCALEオプションのリストがあります。
import es from '@angular/common/locales/es';
import { registerLocaleData } from '@angular/common';
registerLocaleData(es);
次にプロバイダーを追加します
@NgModule({
providers: [
{ provide: LOCALE_ID, useValue: "es-ES" }, //your locale
]
})
HTMLでパイプを使用します。これの角度のドキュメントは次のとおりです。
{{ dateObject | date: 'medium' }}
あなたはこのようなことをします:
{{ dateObj | date:'shortDate' }}
または
{{ dateObj | date:'ddmmy' }}
参照:https : //angular.io/docs/ts/latest/api/common/index/DatePipe-pipe.html
AOTに問題がある場合は、useFactoryで少し異なる方法で行う必要があります。
export function getCulture() {
return 'fr-CA';
}
@NgModule({
providers: [
{ provide: LOCALE_ID, useFactory: getCulture },
//otherProviders...
]
})
{ provide: LOCALE_ID, useFactory: () => 'fr-CA'}
私のためにトリックをしました;)
Googleパイプをコピーしてロケールを変更しましたが、私の国では機能しますが、すべてのロケールで完了しなかった可能性があります。以下はコードです。
import {
isDate,
isNumber,
isPresent,
Date,
DateWrapper,
CONST,
isBlank,
FunctionWrapper
} from 'angular2/src/facade/lang';
import {DateFormatter} from 'angular2/src/facade/intl';
import {PipeTransform, WrappedValue, Pipe, Injectable} from 'angular2/core';
import {StringMapWrapper, ListWrapper} from 'angular2/src/facade/collection';
var defaultLocale: string = 'hr';
@CONST()
@Pipe({ name: 'mydate', pure: true })
@Injectable()
export class DatetimeTempPipe implements PipeTransform {
/** @internal */
static _ALIASES: { [key: string]: String } = {
'medium': 'yMMMdjms',
'short': 'yMdjm',
'fullDate': 'yMMMMEEEEd',
'longDate': 'yMMMMd',
'mediumDate': 'yMMMd',
'shortDate': 'yMd',
'mediumTime': 'jms',
'shortTime': 'jm'
};
transform(value: any, args: any[]): string {
if (isBlank(value)) return null;
if (!this.supports(value)) {
console.log("DOES NOT SUPPORT THIS DUEYE ERROR");
}
var pattern: string = isPresent(args) && args.length > 0 ? args[0] : 'mediumDate';
if (isNumber(value)) {
value = DateWrapper.fromMillis(value);
}
if (StringMapWrapper.contains(DatetimeTempPipe._ALIASES, pattern)) {
pattern = <string>StringMapWrapper.get(DatetimeTempPipe._ALIASES, pattern);
}
return DateFormatter.format(value, defaultLocale, pattern);
}
supports(obj: any): boolean { return isDate(obj) || isNumber(obj); }
}
わかりました、私はこのソリューションを提案します ngx-translate
import { DatePipe } from '@angular/common';
import { Pipe, PipeTransform } from '@angular/core';
import { TranslateService } from '@ngx-translate/core';
@Pipe({
name: 'localizedDate',
pure: false
})
export class LocalizedDatePipe implements PipeTransform {
constructor(private translateService: TranslateService) {
}
transform(value: any): any {
const date = new Date(value);
const options = { weekday: 'long',
year: 'numeric',
month: 'long',
day: 'numeric',
hour: '2-digit',
minute: '2-digit',
second: '2-digit'
};
return date.toLocaleString(this.translateService.currentLang, options);
}
}
これは少し遅れるかもしれませんが、私の場合(角度6)、DatePipeの上に次のような単純なパイプを作成しました。
private _regionSub: Subscription;
private _localeId: string;
constructor(private _datePipe: DatePipe, private _store: Store<any>) {
this._localeId = 'en-AU';
this._regionSub = this._store.pipe(select(selectLocaleId))
.subscribe((localeId: string) => {
this._localeId = localeId || 'en-AU';
});
}
ngOnDestroy() { // Unsubscribe }
transform(value: string | number, format?: string): string {
const dateFormat = format || getLocaleDateFormat(this._localeId, FormatWidth.Short);
return this._datePipe.transform(value, dateFormat, undefined, this._localeId);
}
最善の解決策ではないかもしれませんが、シンプルで機能します。