Bagikan melalui


Menggunakan templat dan pola untuk memformat tanggal dan waktu

Gunakan kelas di namespace layanan Windows.Globalization.DateTimeFormatting dengan templat dan pola kustom untuk menampilkan tanggal dan waktu dalam format yang Anda inginkan.

Pendahuluan

Kelas DateTimeFormatter menyediakan berbagai cara untuk memformat tanggal dan waktu dengan benar untuk bahasa dan wilayah di seluruh dunia. Anda dapat menggunakan format standar untuk tahun, bulan, hari, dan sebagainya. Atau Anda dapat meneruskan templat format ke argumen formatTemplate dari konstruktor DateTimeFormatter , seperti "longdate" atau "hari bulan".

Tetapi ketika Anda ingin kontrol yang lebih besar atas urutan dan format komponen objek DateTime yang ingin Anda tampilkan, Anda dapat meneruskan pola format ke argumen formatTemplate konstruktor. Pola format menggunakan sintaksis khusus, yang memungkinkan Anda mendapatkan komponen individual objek DateTime —hanya nama bulan, atau hanya nilai tahun, misalnya—untuk menampilkannya dalam format kustom apa pun yang Anda pilih. Selain itu, pola dapat dilokalkan untuk beradaptasi dengan bahasa dan wilayah lain.

Catatan Ini hanya gambaran umum pola format. Untuk diskusi templat format dan pola format yang lebih lengkap, lihat bagian Keterangan dari kelas DateTimeFormatter.

Perbedaan antara templat format dan pola format

Templat format adalah string format budaya-agnostik. Jadi, jika Anda membuat DateTimeFormatter menggunakan templat format, pemformat menampilkan komponen format Anda dalam urutan yang tepat untuk bahasa saat ini. Sebaliknya, pola format bersifat khusus budaya. Jika Anda membuat DateTimeFormatter menggunakan pola format, pemformat akan menggunakan pola persis seperti yang diberikan. Akibatnya, pola tidak selalu valid di seluruh budaya.

Mari kita ilustrasikan perbedaan ini dengan contoh. Kita akan meneruskan templat format sederhana (bukan pola) ke konstruktor DateTimeFormatter . Ini adalah templat format "hari bulan".

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

Ini membuat pemformat berdasarkan nilai bahasa dan wilayah dari konteks saat ini. Urutan komponen dalam templat format tidak masalah; formatter menampilkannya dalam urutan yang tepat untuk bahasa saat ini. Jadi, ini menampilkan "1 Januari" untuk bahasa Inggris (Amerika Serikat), "1 janvier" untuk bahasa Prancis (Prancis), dan "1月1日" untuk bahasa Jepang.

Di sisi lain, pola format khusus budaya. Mari kita akses pola format untuk templat format kita.

IReadOnlyList<string> monthDayPatterns = dateFormatter.Patterns;

Ini menghasilkan hasil yang berbeda tergantung pada bahasa dan wilayah runtime. Wilayah yang berbeda mungkin menggunakan komponen yang berbeda, dalam urutan yang berbeda, dengan atau tanpa karakter dan penspasian tambahan.

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

Dalam contoh di atas, kami memasukkan string format budaya-agnostik, dan kami mendapatkan kembali string format khusus budaya (yang merupakan fungsi bahasa dan wilayah yang kebetulan berlaku ketika kami memanggil dateFormatter.Patterns). Oleh karena itu, jika Anda membuat DateTimeFormatter dari pola format khusus budaya, maka itu hanya akan valid untuk bahasa/wilayah tertentu.

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

Formatter di atas mengembalikan nilai khusus budaya untuk komponen individual di dalam tanda kurung {}. Tetapi urutan komponen dalam pola format invariant. Anda mendapatkan dengan tepat apa yang Anda minta, yang mungkin atau mungkin tidak sesuai secara budaya. Formatter ini berlaku untuk bahasa Inggris (Amerika Serikat), tetapi tidak untuk bahasa Prancis (Prancis) atau untuk bahasa Jepang.

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)

Selain itu, pola yang benar hari ini mungkin tidak benar di masa depan. Negara atau wilayah mungkin mengubah sistem kalender mereka, yang mengubah templat format. Windows memperbarui output formatter berdasarkan templat format untuk mengakomodasi perubahan tersebut. Oleh karena itu, Anda hanya boleh menggunakan sintaks pola di bawah satu atau beberapa kondisi ini.

  • Anda tidak bergantung pada output tertentu untuk format.
  • Anda tidak memerlukan format untuk mengikuti beberapa standar khusus budaya.
  • Anda secara khusus berniat pola untuk menjadi invarian di seluruh budaya.
  • Anda ingin melokalisasi string pola format aktual itu sendiri.

Berikut adalah ringkasan perbedaan antara templat format dan pola format.

Format templat, seperti "hari bulan"

  • Representasi abstrak dari format DateTime yang menyertakan nilai untuk bulan, hari, dll., dalam urutan apa pun.
  • Dijamin untuk mengembalikan format standar yang valid di semua nilai wilayah bahasa yang didukung oleh Windows.
  • Dijamin untuk memberi Anda string berformat yang sesuai secara budaya untuk wilayah bahasa tertentu.
  • Tidak semua kombinasi komponen valid. Misalnya, "hari dayofweek" tidak valid.

Pola format, seperti "{month.full} {day.integer}"

  • String yang diurutkan secara eksplisit yang mengekspresikan nama bulan lengkap, diikuti dengan spasi, diikuti dengan bilangan bulat hari, dalam urutan tersebut, atau pola format spesifik apa pun yang Anda tentukan.
  • Mungkin tidak sesuai dengan format standar yang valid untuk pasangan wilayah bahasa apa pun.
  • Tidak dijamin sesuai budaya.
  • Kombinasi komponen apa pun dapat ditentukan, dalam urutan apa pun.

Contoh

Misalkan Anda ingin menampilkan bulan dan hari ini bersama dengan waktu saat ini, dalam format tertentu. Misalnya, Anda ingin pengguna Bahasa Inggris AS melihat sesuatu seperti ini:

June 25 | 1:38 PM

Bagian tanggal sesuai dengan templat format "hari bulan", dan bagian waktu sesuai dengan templat format "menit jam". Jadi, Anda dapat membuat pemformat untuk templat format tanggal dan waktu yang relevan, lalu menggabungkan outputnya bersama-sama menggunakan string format yang dapat dilokalkan.

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 adalah pengidentifikasi sumber daya yang mengacu pada sumber daya yang dapat dilokalkan dalam File Sumber Daya (.resw). Untuk bahasa default bahasa Inggris (Amerika Serikat), ini akan diatur ke nilai "{0} | {1}" bersama dengan komentar yang menunjukkan bahwa "{0}" adalah tanggal dan "{1}" adalah waktunya. Dengan begitu, penerjemah dapat menyesuaikan item format sesuai kebutuhan. Misalnya, mereka dapat mengubah urutan item jika tampaknya lebih alami dalam beberapa bahasa atau wilayah untuk memiliki waktu yang lebih awal dari tanggal. Atau, mereka dapat mengganti "|" dengan beberapa karakter pemisah lainnya.

Cara lain untuk menerapkan contoh ini adalah dengan mengkueri dua pemformat untuk pola formatnya, menggabungkannya bersama-sama, lalu membuat formatter ketiga dari pola format yang dihasilkan.

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 penting