パターンを使って日付と時刻を書式設定する方法 (HTML)

[ この記事は、Windows ランタイム アプリを作成する Windows 8.x および Windows Phone 8.x 開発者を対象としています。Windows 10 向けの開発を行っている場合は、「最新のドキュメント」をご覧ください]

Windows.Globalization.DateTimeFormatting API でカスタム パターンを使うと、日付と時刻を好みどおりの形式で表示することができます。

Windows.Globalization.DateTimeFormatting では、世界中の言語と地域について日付と時刻をさまざまな方法で適切に書式設定できます。 ほとんどの場合、年、月、日などについて標準形式を使うことができます。つまり、"longdate" や "month day" などの標準の文字列テンプレート使って、最終的な DateTime 形式をユーザーのカルチャ、言語、地域に適したものにすることができます。 しかし、場合によっては、表示する DateTime 文字列の構成要素の順序や形式をもっと細かく制御する必要があります。特定の既知のカルチャや地域を対象とする場合や、標準以外の形式で構成要素を表示する場合などです。

この目的で、"パターン"と呼ばれる文字列テンプレート パラメーター用の特別な構文を使うことができます。 パターン構文を使うと、任意に選んだカスタム形式で表示するために、DateTime オブジェクトの個々の構成要素 (たとえば、月の名称のみや年の値のみなど) を取得することができます。

理解しておく必要があること

テクノロジ

必要条件

パターンを使うときは、すべてのカルチャに対して有効であるとは限らないカスタム形式を構築するという点に注意してください。 たとえば、"month day" テンプレートについて考えてみます。

var datefmt = new Windows.Globalization.DateTimeFormatting.DateTimeFormatter("month day");

これにより、現在のコンテキストの言語や地域の値に基づいてフォーマッタが作成されます。そのために、常に、適切なグローバル形式で月と日が一緒に表示されます。たとえば、英語 (米国) の場合は "January 1"、フランス語 (フランス) の場合は "1 janvier"、日本語の場合は "1 月 1 日"と表示されます。 これは、テンプレートがパターン プロパティを使ってアクセスできるカルチャ固有のパターン文字列に基づいているためです。

var monthdaypattern = datefmt.patterns;

これにより、フォーマッタの言語と地域に応じて異なる結果がもたらされます。 さまざまな地域で、順序の違いや文字とスペースの追加の有無など、それぞれ異なる構成要素が使われる場合があります。

En-US: "{month.full} {day.integer}"
Fr-FR: "{day.integer} {month.full}"
Ja-JP: "{month.integer}月{day.integer}日"

パターンを使ってカスタムの DateTimeFormatter を構築することができます。たとえば、この例は米国英語のパターンに基づいています。

var datefmt = new Windows.Globalization.DateTimeFormatting.DateTimeFormatter("{month.full} {day.integer}");

Windows では、中かっこ {} 内の個々の構成要素についてカルチャ固有の値が返されます。 ただし、パターン構文を使った場合、構成要素の順序は不変です。要求どおりのものが得られても、それがカルチャに適していない場合があります。

En-US: January 1
Fr-FR: janvier 1 (inappropriate for France; non-standard order)
Ja-JP: 1月1 (inappropriate for Japan; the day symbol is missing)

さらに、パターンは時間が経過しても一貫性が維持されるとは限りません。 国や地域がカレンダー システムを変更し、書式テンプレートが変わることがあります。 Windows では、このような変更に合わせてフォーマッタの出力を更新します。 したがって、次のような場合に、DateTime を書式設定するために必要な操作は、パターン構文を使うことだけです。

  • 書式設定の特定の出力に依存していない
  • カルチャ固有の標準に従うための書式設定を必要としない
  • すべてのカルチャにわたってパターンが不変であることを特に意図している
  • パターンのローカライズを意図している

標準の文字列テンプレートと標準以外の文字列パターンとの間の相違のまとめ

"month day" などの文字列テンプレート:

  • 月と日の値を含む、ある一定の順序の DateTime 形式の抽象化された表現です。
  • Windows でサポートされているすべての言語と地域にわたって有効な標準の形式を必ず返します。
  • 特定の言語と地域のカルチャに適するように書式設定された文字列を必ず提供します。
  • 構成要素のすべての組み合わせが有効であるとは限りません。たとえば、"dayofweek day" に対応する文字列テンプレートはありません。

"{month.full} {day.integer}" などの文字列パターン:

  • 月の完全な名前の後にスペースが挿入され、その後に日付の整数が続く、特定の順序の明示的に指定された文字列です。
  • 任意の言語と地域のペアについて有効な標準の形式に対応しない場合があります。
  • カルチャに適するとは限りません。
  • 任意の順序の構成要素のあらゆる組み合わせを指定できます。

手順

現在の月と日を特定の形式で現在時刻と一緒に表示するとします。 たとえば、米国英語のユーザーに次のように表示する必要があるとします。

June 25 | 1:38 PM

日付の部分は "month day" テンプレートに対応し、時刻の部分は "hour minute" テンプレートに対応します。そのため、これらのテンプレートを構成するパターンを連結したカスタム形式を作ることができます。

まず、関連する日付のテンプレートと時刻のテンプレートのフォーマッタを取得してから、これらのテンプレートのパターンを取得します。

// Get formatters for the date part and the time part.
var dtf = Windows.Globalization.DateTimeFormatting;
var mydate = dtf.DateTimeFormatter("month day");
var mytime = dtf.DateTimeFormatter("hour minute");

// Get the patterns from these formatters.
var mydatepattern = mydate.patterns[0];
var mytimepattern = mytime.patterns[0];

カスタム形式は、ローカライズ可能なリソース文字列として保存する必要があります。 たとえば、英語 (米国) の場合の文字列は "{date} | {time}" となります。 ローカライズ担当者は、必要に応じてこの文字列を調整することができます。たとえば、時刻を日付より前に配置する方が一部の言語や地域では自然であると思われる場合は、構成要素の順序を変更できます。また、"|" を別の区切り文字に置き換えることができます。 実行時に、該当するパターンを使って文字列の {date} 部分と {time} 部分を置き換えます。

// Assemble the custom pattern. This string comes from a resource, and should be localizable. 
var mydateplustime = WinJS.Resources.getString("date_plus_time");
mydateplustime = mydateplustime.replace("{date}", mydatepattern);
mydateplustime = mydateplustime.replace("{time}", mytimepattern);

これで、カスタム パターンに基づいて新しいフォーマッタを構築できるようになりました。

// Get the custom formatter.
var mydateplustimefmt = new dtf.DateTimeFormatter(mydateplustime);

関連トピック

日付と時刻の書式設定のサンプルに関するページ

Windows.Globalization.DateTimeFormatting

Windows.Foundation.DateTime