Udostępnij przez


Używanie szablonów i wzorców do formatowania dat i godzin

Użyj klas w Windows.Globalization.DateTimeFormatting przestrzeni nazw z szablonami niestandardowymi i wzorcami, aby wyświetlić daty i godziny dokładnie w formacie, który chcesz.

Wprowadzenie

Klasa DateTimeFormatter udostępnia różne sposoby poprawnego formatowania dat i godzin dla języków i regionów na całym świecie. Możesz używać standardowych formatów dla roku, miesiąca, dnia itd. Możesz też przekazać wzorzec formatowania jako argument formatTemplate w konstruktorze DateTimeFormatter, taki jak "longdate" lub "dzień miesiąca".

Jeśli jednak chcesz mieć jeszcze większą kontrolę nad kolejnością i formatem składników obiektu DateTime , które chcesz wyświetlić, możesz przekazać wzorzec formatu do argumentu formatTemplate konstruktora. Wzorzec formatu używa specjalnej składni, która umożliwia uzyskanie poszczególnych składników obiektu DateTime — tylko nazwy miesiąca lub tylko wartości roku — na przykład w celu wyświetlenia ich w wybranym formacie niestandardowym. Ponadto wzorzec można lokalizować w celu dostosowania do innych języków i regionów.

Uwaga To jest tylko ogólny zarys wzorców formatów. Aby uzyskać bardziej kompletną dyskusję na temat szablonów formatów i wzorców formatów, zobacz sekcję Uwagi klasy DateTimeFormatter .

Różnica między szablonami formatów a wzorcami formatowania

Szablon formatu to kulturowo neutralny ciąg formatujący. Dlatego jeśli skonstruujesz element DateTimeFormatter przy użyciu szablonu formatu, formatujący wyświetla składniki formatu w odpowiedniej kolejności dla bieżącego języka. Z drugiej strony wzorzec formatu jest specyficzny dla kultury. Jeśli skonstruujesz element DateTimeFormatter przy użyciu wzorca formatu, formater będzie używać wzorca dokładnie tak jak podane. W związku z tym wzorzec nie musi być prawidłowy w różnych kulturach.

Zilustrujmy to rozróżnienie z przykładem. Przekażemy prosty szablon formatu (a nie wzorzec) do konstruktora DateTimeFormatter . Jest to szablon formatu "dzień miesiąca".

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

Spowoduje to utworzenie formatującego na podstawie wartości języka i regionu bieżącego kontekstu. Kolejność składników w szablonie formatu nie ma znaczenia; program formatujący wyświetla je w odpowiedniej kolejności dla bieżącego języka. Dlatego wyświetla wartość "1 stycznia" dla języka angielskiego (Stany Zjednoczone), "1 janvier" dla języka francuskiego (Francja) i "1月1日" dla języka japońskiego.

Z drugiej strony wzorzec formatu jest specyficzny dla kultury. Uzyskajmy dostęp do wzorca formatu dla naszego szablonu formatu.

IReadOnlyList<string> monthDayPatterns = dateFormatter.Patterns;

Daje to różne wyniki w zależności od języka i regionu środowiska uruchomieniowego. Różne regiony mogą używać różnych składników w różnych kolejności, z dodatkowymi znakami i odstępami lub bez nich.

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

W powyższym przykładzie wprowadziliśmy ciąg formatu niezależny od kultury i otrzymaliśmy ciąg formatu specyficzny dla kultury (który był funkcją języka i regionu obowiązującego w momencie wywołania dateFormatter.Patterns). Wynika z tego, że w przypadku konstruowania elementu DateTimeFormatter na podstawie wzorca formatu specyficznego dla kultury będzie on prawidłowy tylko dla określonych języków/regionów.

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

Powyższy formater zwraca kulturowo specyficzne wartości dla poszczególnych składników w nawiasach {}. Jednak kolejność składników we wzorcu formatu jest niezmienna. Dokładnie dowiesz się, o co prosisz, co może być lub nie jest odpowiednie kulturowo. Ten formater jest prawidłowy dla języka angielskiego (Stany Zjednoczone), ale nie dla języka francuskiego (Francja) ani japońskiego.

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)

Ponadto wzorzec, który jest poprawny dzisiaj, może nie być poprawny w przyszłości. Kraje lub regiony mogą zmieniać swoje systemy kalendarzowe, co skutkuje zmianą szablonu formatu. System Windows aktualizuje dane wyjściowe formaterów na podstawie szablonów formatów, aby uwzględnić takie zmiany. W związku z tym należy używać składni wzorca tylko w co najmniej jednym z tych warunków.

  • Nie jesteś zależny od konkretnego formatu wyjściowego.
  • Format nie jest potrzebny do przestrzegania standardu specyficznego dla kultury.
  • W szczególności zamierzasz, aby wzorzec był niezmienny w różnych kulturach.
  • Zamierzasz zlokalizować rzeczywisty ciąg wzorca formatu.

Poniżej przedstawiono podsumowanie różnic między szablonami formatów a wzorcami formatowania.

szablony Format, takie jak "dzień miesiąca"

  • Abstrakcyjna reprezentacja formatu DateTime , który zawiera wartości miesiąca, dnia itp., w dowolnej kolejności.
  • Gwarantowane zwracanie prawidłowego standardowego formatu we wszystkich wartościach regionów języka obsługiwanych przez system Windows.
  • Gwarantuje odpowiednio kulturowo sformatowany ciąg dla danego regionu językowego.
  • Nie wszystkie kombinacje składników są prawidłowe. Na przykład wartość "dayofweek day" jest nieprawidłowa.

Wzorce formatowania, takie jak "{month.full} {day.integer}"

  • Jawnie uporządkowany ciąg, który wyraża pełną nazwę miesiąca, po którym następuje spacja, a następnie liczba całkowita dnia w tej kolejności lub dowolny określony wzorzec formatu.
  • Może nie odpowiadać prawidłowemu formatowi standardowemu dla żadnej pary języków-regionów.
  • Nie ma gwarancji, że jest to właściwe kulturowo.
  • Można określić dowolną kombinację składników w dowolnej kolejności.

Przykłady

Załóżmy, że chcesz wyświetlić bieżący miesiąc i dzień wraz z bieżącym czasem w określonym formacie. Na przykład chcesz, aby użytkownicy języka angielskiego w Stanach Zjednoczonych widzieli coś podobnego do następującego:

June 25 | 1:38 PM

Część daty odpowiada szablonowi formatu "dzień miesiąca", a część godziny odpowiada szablonowi formatu "godzina minuty". W związku z tym można tworzyć formatery dla odpowiednich szablonów formatu daty i godziny, a następnie łączyć ich wyniki przy użyciu zlokalizowanego ciągu formatu.

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 jest identyfikatorem zasobu odwołującym się do zasobu lokalizowalnego w pliku zasobów (resw). W przypadku domyślnego języka angielskiego (Stany Zjednoczone) zostanie ona ustawiona na wartość "{0} | {1}" wraz z komentarzem wskazującym, że "{0}" jest datą i "{1}" jest godziną. W ten sposób tłumacze mogą dostosować elementy formatu zgodnie z potrzebami. Na przykład mogą zmienić kolejność elementów, jeśli wydaje się bardziej naturalne w jakimś języku lub regionie, aby godzina poprzedzała datę. Mogą też zastąpić znak "|" innym znakiem separatora.

Innym sposobem zaimplementowania tego przykładu jest wykonywanie zapytań o dwa formatery dla ich wzorców formatowania, łączenie tych razem, a następnie konstruowanie trzeciego formatatora ze wzorca formatu wynikowego.

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

Ważne interfejsy API