Share via


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

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

Einführung

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.

Hinweis: 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 mit einer Formatvorlage erstellen, zeigt der Formatierer 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, verwendet der Formatierer das Muster genau wie angegeben. Folglich ist ein Muster nicht notwendigerweise in allen Kulturen gültig.

Lassen Sie uns diese Unterscheidung anhand eines Beispiels 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");

Dadurch wird ein Formatierer basierend auf dem Sprach- und Regionswert des aktuellen Kontexts erstellt. Die Reihenfolge der Komponenten in einer Formatvorlage spielt keine Rolle; der Formatierer zeigt sie in der richtigen Reihenfolge für die aktuelle Sprache an. Sie zeigt also „Januar 1“ für Englisch (USA), „1 janvier“ für Französisch (Frankreich) und „1月1本“ für Japanisch an.

Andererseits ist ein Formatmuster kulturspezifisch. Lassen Sie uns auf das Formatmuster für unsere Formatvorlage zugreifen.

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ückgegeben (die eine Funktion der Sprache und Region war, die zum Zeitpunkt des Aufrufs von dateFormatter.Patterns in Kraft waren). 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, was Sie verlangen, was kulturell angemessen sein kann oder auch nicht. Dieser Formatierer ist für Englisch (Vereinigte Staaten) 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 berücksichtigen. Daher sollten Sie die Mustersyntax nur unter einer oder mehreren dieser Bedingungen verwenden.

  • Sie sind nicht von einer bestimmten Ausgabe für ein Format abhängig.
  • Sie benötigen das Format nicht, um einem kulturspezifischen Standard zu entsprechen.
  • Sie beabsichtigen ausdrücklich, dass das Muster kulturübergreifend unveränderlich sein soll.
  • Sie beabsichtigen, die tatsächliche Formatmusterzeichenfolge selbst zu lokalisieren.

Hier ist eine Zusammenfassung der Unterscheidung zwischen Formatvorlagen und Formatmustern.

Formatvorlagen, z. B. „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 zulässig. Beispielsweise ist „dayofweek day“ ungültig.

Formatieren von Mustern wie „{month.full} {day.integer}“

  • Explizit geordnete Zeichenkette, die den vollständigen Monatsnamen, gefolgt von einem Leerzeichen, gefolgt von der Ganzzahl des Tages in dieser Reihenfolge oder einem von Ihnen angegebenen spezifischen Formatmuster enthält.
  • Entspricht möglicherweise keinem gültigen Standardformat für jedes Sprachregionenpaar.
  • Nicht garantiert, dass sie kulturell angemessen sind.
  • 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 der Standardsprache Englisch (Vereinigte Staaten) wird dies zusammen mit einem Kommentar auf den Wert „{0} |{1}“ festgelegt, der angibt, dass „{0}“ das Datum und „{1}“ die Uhrzeit ist. 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