この記事は編集レビューを必要としています。ぜひご協力ください。
これは実験段階の機能です。
この機能は複数のブラウザで開発中の状態にあります。互換性テーブルをチェックしてください。また、実験段階の機能の構文と挙動は、仕様変更に伴い各ブラウザの将来のバージョンで変更になる可能性があることに注意してください。
Intl.DateTimeFormat.prototype.formatToParts() メソッドは、DateTimeFormat フォーマットによって生成されるロケール対応書式を設定可能にします
構文
Intl.DateTimeFormat.prototype.formatToParts(date)
パラメーター
dateOptional- フォーマットする日付。
戻り値
フォーマットされた日付のパーツを含むオブジェクトの Array。
説明
formatToParts() メソッドは、日付文字列のフォーマットをカスタマイズするときに役立ちます。これは、ロケール特有の部分を保持しながら、カスタム文字列を構築できるロケール特有のトークンを含むオブジェクトの Array を返します。formatToParts() メソッドが返却する構造は、このようになります:
[
{ type: "day", value: "17" },
{ type: "weekday", value "Monday" }
]
可能な type 以下のとおりです。
- day
- 日付として使用される文字列。たとえば、 "17"。
- dayPeriod
- 日付期間として使用される文字列。たとえば、"AM" や "PM"(現在は、"dayperiod" として実装されています。バグ 1260858) を見てください)。
- era
- 時代として使用される文字列。たとえば、"BC" や "AD"。
- hour
- 時刻として使用される文字列。たとえば、"3" や "03"。
- minute
- 分として使用される文字列。たとえば、"00"。
- month
- 月として使用される文字列。たとえば、"12"。
- second
- 秒として使用される文字列。たとえば、"07" や "42"。
- separator
- 日付や時刻の区切りとして使用される文字列。たとえば、" : , / " のいずれか。("separator" は "literal" に変更されるでしょう。バグ 1260858 を見てください)。
- timeZoneName
- タイムゾーン名として使用される文字列。たとえば、"UTC"。
- weekday
- 曜日として使用される文字列。たとえば、"M" や "Monday"、"Montag"。
- year
- 年として使用される文字列。たとえば、"2012" や "96"。
例
DateTimeFormat は、ローカライズされた、不透過で直接操作できない文字列を出力します:
var date = Date.UTC(2012, 11, 17, 3, 0, 42);
var formatter = new Intl.DateTimeFormat("en-us", {
weekday: 'long',
year: 'numeric',
month: 'numeric',
day: 'numeric',
hour: 'numeric',
minute: 'numeric',
second: 'numeric',
hour12: true,
timeZone: "UTC"
});
formatter.format(date);
// "Monday, 12/17/2012, 3:00:42 AM"
しかし、多くのユーザーインターフェースにおいて、この文字列フォーマットをカスタマイズしたいという要望があります。formatToParts メソッドは、文字列のパーツを提供することで、DateTimeFormat フォーマットによって生成されるロケール対応書式を設定可能にします:
formatter.formatToParts(date);
// 戻り値:
[
{ type: 'weekday', value: 'Monday' },
{ type: 'separator', value: ', ' },
{ type: 'month', value: '12' },
{ type: 'separator', value: '/' },
{ type: 'day', value: '17' },
{ type: 'separator', value: '/' },
{ type: 'year', value: '2012' },
{ type: 'separator', value: ', ' },
{ type: 'hour', value: '3' },
{ type: 'separator', value: ':' },
{ type: 'minute', value: '00' },
{ type: 'separator', value: ':' },
{ type: 'second', value: '42' },
{ type: 'separator', value: ' ' },
{ type: 'dayperiod', value: 'AM' }
]
情報を個別に利用してフォーマットし、独自の方法で再結合できます。たとえば、Array.prototype.map() や アロー関数、switch ステートメント、template strings、Array.prototype.reduce() で使用できます。
var dateString = formatter.formatToParts(date).map(({type, value}) => {
switch (type) {
case 'dayperiod': return `<strong>${value}</strong>`;
default : return value;
}
}).reduce((string, part) => string + part);
formatToParts() メソッドを使用した場合、日付期間を太字にします。
console.log(formatter.format(date)); // "Monday, 12/17/2012, 3:00:42 AM" console.log(dateString); // "Monday, 12/17/2012, 3:00:42 <strong>AM</strong>"
仕様
| 仕様 | 状態 | コメント |
|---|---|---|
| ECMAScript Internationalization API 4.0 (ECMA-402) Intl.DateTimeFormat.prototype.formatToParts の定義 |
ドラフト | いまだ仕様草案に含まれていません。issue #30 と PR #64 を見てください。ポリフィルはこの proposal repository で使用できます。 |
ブラウザ実装状況
| 機能 | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari (WebKit) |
|---|---|---|---|---|---|
| 基本サポート | 未サポート | 未サポート [1] | 未サポート | 未サポート | 未サポート |
| 機能 | Android | Chrome for Android | Firefox Mobile (Gecko) | IE Phone | Opera Mobile | Safari Mobile |
|---|---|---|---|---|---|---|
| 基本サポート | 未サポート | 未サポート | 未サポート [1] | 未サポート | 未サポート | 未サポート |
[1] 現在、このメソッドは、B2G システムアプリにのみ公開されています(バグ 1216150 を見てください)。