次の方法で共有


テンプレートとパターンを使用して日付と時刻を書式設定する

Windows.Globalization.DateTimeFormatting 名前空間のクラスとカスタム テンプレートとパターンを使用して、日付と時刻を目的の形式で正確に表示します。

イントロダクション

DateTimeFormatter クラスは、世界中の言語と地域の日付と時刻を適切に書式設定するさまざまな方法を提供します。 年、月、日などの標準形式を使用できます。 または、"longdate" や "month day" など、DateTimeFormatter コンストラクターの formatTemplate 引数に書式テンプレートを渡すこともできます。

ただし、表示する DateTime オブジェクトのコンポーネントの順序と形式をさらに制御する必要がある場合は、コンストラクターの formatTemplate 引数に書式パターンを渡すことができます。 書式パターンでは特殊な構文を使用します。これにより、DateTime オブジェクトの個々のコンポーネント (月の名前や年の値など) を取得して、任意のカスタム形式で表示できます。 さらに、パターンをローカライズして、他の言語や地域に適応させることができます。

これはフォーマット パターンの概要にすぎません。 書式テンプレートと書式パターンの詳細については、DateTimeFormatter クラスの の「解説」セクションを参照してください。

書式テンプレートと書式パターンの違い

書式テンプレートは、カルチャに依存しない書式指定文字列です。 したがって、書式テンプレートを使用して DateTimeFormatter を作成すると、フォーマッタは現在の言語に適した順序で書式コンポーネントを表示します。 逆に、書式パターンはカルチャ固有です。 書式パターンを使用して DateTimeFormatter を構築する場合、フォーマッタは指定されたとおりにパターンを使用します。 したがって、パターンは、カルチャ間で必ずしも有効であるとは限りません。

この違いを例で示しましょう。 DateTimeFormatter コンストラクターに単純な書式テンプレート (パターンではありません) を渡します。 これは、フォーマットテンプレート「month day」です。

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

これにより、現在のコンテキストの言語と地域の値に基づいてフォーマッタが作成されます。 フォーマット テンプレート内のコンポーネントの順序は関係ありません。フォーマッタは、現在の言語に合った順序で表示します。 そのため、英語 (米国) の場合は "1 月 1 日"、フランス語 (フランス) の場合は "1 janvier"、日本語の場合は "1 月 1 日" と表示されます。

一方、書式パターンはカルチャ固有です。 書式テンプレートの書式パターンにアクセスしてみましょう。

IReadOnlyList<string> monthDayPatterns = dateFormatter.Patterns;

これにより、ランタイムの言語とリージョンに応じて異なる結果が生成されます。 異なるリージョンでは、異なるコンポーネントが異なる順序で使用される場合があり、追加の文字とスペースの有無に関係なく使用されます。

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

上の例では、カルチャに依存しない書式指定文字列を入力し、カルチャ固有の書式指定文字列 (dateFormatter.Patterns呼び出したときに有効になった言語と地域の関数) を取得しました。 したがって、カルチャ固有の形式パターンから DateTimeFormatter を構築した場合、特定の言語/地域でのみ有効になります。

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

上記のフォーマッタは、角かっこ内の各コンポーネントに対してカルチャ固有の値を返します {}。 ただし、フォーマット パターン内のコンポーネントの順序は不変です。 あなたは正確にあなたが求めるものを得る、それは文化的に適切かもしれないし、そうでないかもしれない。 このフォーマッタは英語 (米国) では有効ですが、フランス語 (フランス) と日本語では有効ではありません。

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 では、このような変更に対応するために、書式テンプレートに基づいてフォーマッタの出力が更新されます。 したがって、これらの条件の 1 つ以上の下でのみパターン構文を使用する必要があります。

  • 特定の形式の出力に依存していません。
  • カルチャ固有の標準に従う形式は必要ありません。
  • 具体的には、パターンがカルチャ間で不変であることを意図しています。
  • 実際の書式パターン文字列自体をローカライズする予定です。

書式テンプレートと書式パターンの区別の概要を次に示します。

テンプレートの書式設定 ("月の日" など)

  • 月、日などの値を任意の順序で含む DateTime 形式の抽象表現。
  • Windows でサポートされているすべての言語領域の値に対して、有効な標準形式を返す必要があります。
  • 指定された言語領域に対して文化に適したフォーマットされた文字列を提供することが保証されます。
  • コンポーネントのすべての組み合わせが有効なわけではありません。 たとえば、"dayofweek day" は無効です。

形式パターン ("{month.full} {day.integer}" など)

  • 完全な月の名前、スペース、日の整数、その順序、または指定した特定の書式パターンを表す明示的に順序付けされた文字列。
  • 言語と地域のペアの有効な標準形式に対応していない場合があります。
  • 文化的に適切であるとは限りません。
  • コンポーネントの任意の組み合わせを任意の順序で指定できます。

例示

現在の月と日を現在の時刻と共に特定の形式で表示するとします。 たとえば、米国の英語ユーザーに次のような表示を求めます。

June 25 | 1:38 PM

日付部分は "月の日" 書式テンプレートに対応し、時刻部分は "時間分" 書式テンプレートに対応します。 そのため、関連する日時書式指定テンプレートのフォーマッタを作成し、ローカライズ可能な書式指定文字列を使用して出力を連結することができます。

var dateToFormat = System.DateTime.Now;
var resourceLoader = Windows.ApplicationModel.Resources.ResourceLoader.GetForCurrentView();

var dateFormatter = new Windows.Globalization.DateTimeFormatting.DateTimeFormatter("month day");
var timeFormatter = new Windows.Globalization.DateTimeFormatting.DateTimeFormatter("hour minute");

var date = dateFormatter.Format(dateToFormat);
var time = timeFormatter.Format(dateToFormat);

string output = string.Format(resourceLoader.GetString("CustomDateTimeFormatString"), date, time);

CustomDateTimeFormatString は、リソース ファイル (.resw) 内のローカライズ可能なリソースを参照するリソース識別子です。 英語 (米国) の既定の言語の場合、これは "{0} | の値に設定されます。{1}"、"{0}" が日付、"{1}" が時刻であることを示すコメントが表示されます。 そうすることで、翻訳者は必要に応じて書式項目を調整できます。 たとえば、一部の言語または地域で時間が日付より前にあるように見える場合は、項目の順序を変更できます。 または、"|" を他の区切り文字に置き換えることができます。

この例を実装するもう 1 つの方法は、2 つのフォーマッタに対して書式パターンのクエリを実行し、それらを連結してから、結果の書式パターンから 3 番目のフォーマッタを構築することです。

var resourceLoader = Windows.ApplicationModel.Resources.ResourceLoader.GetForCurrentView();

var dateFormatter = new Windows.Globalization.DateTimeFormatting.DateTimeFormatter("month day");
var timeFormatter = new Windows.Globalization.DateTimeFormatting.DateTimeFormatter("hour minute");

string dateFormatterPattern = dateFormatter.Patterns[0];
string timeFormatterPattern = timeFormatter.Patterns[0];

string pattern = string.Format(resourceLoader.GetString("CustomDateTimeFormatString"), dateFormatterPattern, timeFormatterPattern);

var patternFormatter = new Windows.Globalization.DateTimeFormatting.DateTimeFormatter(pattern);

string output = patternFormatter.Format(System.DateTime.Now);

重要な API