Freigeben über


Verwenden von Vorlagen und Mustern zum Formatieren von Datums- und Uhrzeitangaben

Verwenden Sie Klassen im Windows.Globalization.DateTimeFormatting-Namespace mit benutzerdefinierten Vorlagen und Mustern, um Datums- und Uhrzeitangaben im gewünschten Format anzuzeigen.

Einleitung

Die DateTimeFormatter-Klasse bietet verschiedene Möglichkeiten, Datums- und Uhrzeitangaben für Sprachen und Regionen auf der ganzen Welt ordnungsgemäß zu formatieren. Sie können Standardformate für Jahr, Monat, Tag usw. verwenden. Alternativ können Sie eine Formatvorlage an das formatTemplate Argument des DateTimeFormatter Konstruktors übergeben, z. B. "longdate" oder "month day".

Wenn Sie jedoch noch mehr Kontrolle über die Reihenfolge und das Format der Komponenten des DateTime-Objekts wünschen, das Sie anzeigen möchten, können Sie ein Formatmuster an das FormatTemplate-Argument des Konstruktors übergeben. Ein Formatmuster verwendet eine spezielle Syntax, mit der Sie einzelne Komponenten eines DateTime-Objekts abrufen können , z. B. den Monatsnamen oder nur den Jahreswert, um sie in beliebigem benutzerdefinierten Format anzuzeigen. Darüber hinaus kann das Muster lokalisiert werden, um sich an andere Sprachen und Regionen anzupassen.

Anmerkung Dies ist nur eine Übersicht über Formatmuster. Eine ausführlichere Erläuterung von Formatvorlagen und Formatmustern finden Sie im Abschnitt "Hinweise" der DateTimeFormatter-Klasse .

Der Unterschied zwischen Formatvorlagen und Formatmustern

Eine Formatvorlage ist eine kulturunabhängige Formatzeichenfolge. Wenn Sie also einen DateTimeFormatter- mithilfe einer Formatvorlage erstellen, zeigt der Formatter die Formatkomponenten in der richtigen Reihenfolge für die aktuelle Sprache an. Umgekehrt ist ein Formatmuster kulturspezifisch. Wenn Sie einen DateTimeFormatter mit einem Formatmuster erstellen, wird der Formatter das Muster exakt wie angegeben verwenden. Folglich ist ein Muster nicht notwendigerweise in allen Kulturen gültig.

Lassen Sie uns diese Unterscheidung mit einem Beispiel veranschaulichen. Wir übergeben eine einfache Formatvorlage (kein Muster) an den DateTimeFormatter-Konstruktor . Dies ist die Formatvorlage "Monatstag".

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

Dies erstellt einen Formatierer basierend auf dem Sprach- und Regionalwert des aktuellen Kontexts. Die Reihenfolge der Komponenten in einer Formatvorlage spielt keine Rolle; der Formatierer zeigt sie in der richtigen Reihenfolge für die aktuelle Sprache an. Es zeigt also "1. Januar" für Englisch (USA), "1 janvier" für Französisch (Frankreich) und "1月1日" für Japanisch an.

Andererseits ist ein Formatmuster kulturspezifisch. Greifen wir auf das Formatmuster für unsere Formatvorlage zu.

IReadOnlyList<string> monthDayPatterns = dateFormatter.Patterns;

Dadurch werden je nach Laufzeitsprache und Region unterschiedliche Ergebnisse erzielt. In verschiedenen Regionen können unterschiedliche Komponenten in unterschiedlichen Reihenfolgen mit oder ohne zusätzliche Zeichen und Abstände verwendet werden.

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

Im obigen Beispiel haben wir eine kulturagnostische Formatzeichenfolge eingegeben, und wir haben eine kulturspezifische Formatzeichenfolge zurückbekommen (die eine Funktion der Sprache und Region war, die in Kraft war, als wir dateFormatter.Patternsaufgerufen haben). Wenn Sie daher ein DateTimeFormatter aus einem kulturspezifischen Formatmuster erstellen, ist es nur für bestimmte Sprachen/Regionen gültig.

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

Der obige Formatierer gibt kulturspezifische Werte für die einzelnen Komponenten in den Klammern {}zurück. Die Reihenfolge der Komponenten in einem Formatmuster ist jedoch unveränderlich. Sie bekommen genau das, wonach Sie fragen, was möglicherweise nicht kulturell angemessen ist. Dieser Formatierer ist für Englisch (USA) gültig, aber nicht für Französisch (Frankreich) oder für Japanisch.

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)

Darüber hinaus ist ein muster, das heute richtig ist, in Zukunft möglicherweise nicht richtig. Länder oder Regionen können ihre Kalendersysteme ändern, wodurch eine Formatvorlage geändert wird. Windows aktualisiert die Ausgabe von Formatierern basierend auf Formatvorlagen, um solche Änderungen zu ermöglichen. Daher sollten Sie die Mustersyntax nur unter einer oder mehreren dieser Bedingungen verwenden.

  • Sie sind nicht von einer bestimmten Ausgabe in Bezug auf ein Format abhängig.
  • Sie benötigen das Format nicht, um einem kulturspezifischen Standard zu entsprechen.
  • Sie beabsichtigen insbesondere, dass das Muster in allen Kulturen unveränderlich ist.
  • Sie möchten die tatsächliche Formatzeichenfolge selbst lokalisieren.

Hier ist eine Zusammenfassung der Unterscheidung zwischen Formatvorlagen und Formatmustern.

Formatvorlagen wie "Monatstag"

  • Abstrahierte Darstellung eines DateTime-Formats , das Werte für Monat, Tag usw. in beliebiger Reihenfolge enthält.
  • Garantiert, dass ein gültiges Standardformat für alle von Windows unterstützten Sprachregionenwerte zurückgegeben wird.
  • Garantiert, dass Sie eine kulturell passende formatierte Zeichenfolge für die jeweilige Sprachregion erhalten.
  • Nicht alle Kombinationen von Komponenten sind gültig. Beispielsweise ist "dayofweek day" ungültig.

Formatmuster wie "{month.full} {day.integer}"

  • Explizit festgelegte Zeichenfolge, die den vollen Monatsnamen ausdrückt, gefolgt von einem Leerzeichen, gefolgt von dem ganzzahligen Tag, in genau dieser Reihenfolge oder einem bestimmten Formatmuster, das Sie angeben.
  • Entspricht möglicherweise keinem gültigen Standardformat für jedes Sprachregionenpaar.
  • Nicht garantiert, kulturell angemessen zu sein.
  • Jede Kombination von Komponenten kann in beliebiger Reihenfolge angegeben werden.

Beispiele

Angenommen, Sie möchten den aktuellen Monat und den aktuellen Tag zusammen mit der aktuellen Uhrzeit in einem bestimmten Format anzeigen. Sie möchten z. B., dass US-Englisch-Benutzer etwas wie folgt sehen:

June 25 | 1:38 PM

Der Datumsteil entspricht der Formatvorlage "Monatstag", und der Zeitteil entspricht der Formatvorlage "Stunde Minute". Sie können also Formatierer für die relevanten Datums- und Uhrzeitformatvorlagen erstellen und dann ihre Ausgabe mithilfe einer lokalisierbaren Formatzeichenfolge verketten.

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 ist ein Ressourcenbezeichner, der auf eine lokalisierbare Ressource in einer Ressourcendatei (.resw) verweist. Bei einer Standardsprache von Englisch (USA) wird dies auf den Wert "{0} | {1}" gesetzt, zusammen mit einem Kommentar, der angibt, dass "{0}" das Datum ist und "{1}" die Uhrzeit. Auf diese Weise können Übersetzer die Formatelemente nach Bedarf anpassen. Sie können z. B. die Reihenfolge der Elemente ändern, wenn es in einer bestimmten Sprache oder Region natürlicher erscheint, die Uhrzeit vor dem Datum zu haben. Oder sie können "|" durch ein anderes Trennzeichen ersetzen.

Eine weitere Möglichkeit zum Implementieren dieses Beispiels besteht darin, die beiden Formatierer nach ihren Formatmustern abzufragen, diese miteinander zu verketten und dann einen dritten Formatierer aus dem resultierenden Formatmuster zu erstellen.

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);

Wichtige APIs