Saya bermain-main dengan metode Datetime.ParseExact, dan ia menginginkan IFormatProvider ...
Ia bekerja memasukkan null, tetapi apa sebenarnya fungsinya?
Saya bermain-main dengan metode Datetime.ParseExact, dan ia menginginkan IFormatProvider ...
Ia bekerja memasukkan null, tetapi apa sebenarnya fungsinya?
Jawaban:
Selain jawaban Ian Boyd:
Juga CultureInfo
mengimplementasikan antarmuka ini dan dapat digunakan dalam kasus Anda. Jadi Anda bisa mengurai string tanggal Prancis misalnya; Anda bisa menggunakan
var ci = new CultureInfo("fr-FR");
DateTime dt = DateTime.ParseExact(yourDateInputString, yourFormatString, ci);
DateTime.ParseExact(string, string, IFormatProvider)
sebagai gantinya, saya percaya - seperti itu: DateTime.ParseExact("20160409 111559","yyyyMMdd HHmmss",CultureInfo.CurrentCulture)
DateTime dt = DateTime.Parse(yourDateInputString, ci);
Harap perbaiki jawaban Anda.
The IFormatProvider
antarmuka biasanya dilaksanakan untuk Anda oleh CultureInfo
kelas, misalnya:
CultureInfo.CurrentCulture
CultureInfo.CurrentUICulture
CultureInfo.InvariantCulture
CultureInfo.CreateSpecificCulture("de-CA") //German (Canada)
Antarmuka adalah gerbang bagi suatu fungsi untuk mendapatkan sekumpulan data khusus budaya dari suatu budaya. Dua objek budaya yang umum tersedia yang IFormatProvider
dapat ditanyakan adalah:
Cara biasanya bekerja adalah Anda meminta IFormatProvider
untuk memberi Anda sebuah DateTimeFormatInfo
objek:
DateTimeFormatInfo format;
format = (DateTimeFormatInfo)provider.GetFormat(typeof(DateTimeFormatInfo));
if (format != null)
DoStuffWithDatesOrTimes(format);
Ada juga pengetahuan orang dalam bahwa setiap IFormatProvider
antarmuka kemungkinan diimplementasikan oleh kelas yang diturunkan dari CultureInfo
, atau diturunkan dari DateTimeFormatInfo
, sehingga Anda dapat mentransmisikan antarmuka secara langsung:
CultureInfo info = provider as CultureInfo;
if (info != null)
format = info.DateTimeInfo;
else
{
DateTimeFormatInfo dtfi = provider as DateTimeFormatInfo;
if (dtfi != null)
format = dtfi;
else
format = (DateTimeFormatInfo)provider.GetFormat(typeof(DateTimeFormatInfo));
}
if (format != null)
DoStuffWithDatesOrTimes(format);
Semua kerja keras itu telah dituliskan untuk Anda:
Untuk mendapatkan DateTimeFormatInfo
dariIFormatProvider
:
DateTimeFormatInfo format = DateTimeFormatInfo.GetInstance(provider);
Untuk mendapatkan NumberFormatInfo
dariIFormatProvider
:
NumberFormatInfo format = NumberFormatInfo.GetInstance(provider);
Nilai dari itu IFormatProvider
adalah Anda menciptakan objek budaya Anda sendiri. Selama mereka menerapkan IFormatProvider
, dan mengembalikan objek yang diminta, Anda dapat melewati budaya bawaan.
Anda juga dapat menggunakan IFormatProvider
untuk cara melewati objek budaya sewenang-wenang - melalui IFormatProvider
. Misalnya nama dewa dalam budaya yang berbeda
Ini memungkinkan LordsNameFormatInfo
kelas kustom Anda ikut serta di dalam IFormatProvider
, dan Anda dapat mempertahankan idiom tersebut.
Pada kenyataannya Anda tidak perlu menyebut GetFormat
metode IFormatProvider
diri Anda sendiri.
Kapan pun Anda membutuhkannya, IFormatProvider
Anda dapat memberikan CultureInfo
objek:
DateTime.Now.ToString(CultureInfo.CurrentCulture);
endTime.ToString(CultureInfo.InvariantCulture);
transactionID.toString(CultureInfo.CreateSpecificCulture("qps-ploc"));
Catatan : Kode apa pun dilepaskan ke domain publik. Tidak diperlukan atribusi.
Meneruskan nol sebagai IFormatProvider
bukan cara yang benar untuk melakukan ini. Jika pengguna memiliki format tanggal / waktu khusus di PC mereka, Anda akan mengalami masalah dalam penguraian dan konversi ke string. Saya baru saja memperbaiki bug di mana seseorang telah mengirimkan null sebagai IFormatProvider saat mengonversi ke string.
Sebaliknya Anda harus menggunakan CultureInfo.InvariantCulture
Salah:
string output = theDate.ToString("dd/MM/yy HH:mm:ss.fff", null);
Benar:
string output = theDate.ToString("dd/MM/yy HH:mm:ss.fff", CultureInfo.InvariantCulture);
CultureInfo.InvariantCulture
bukan CultureInfo.CurrentCulture
?
null
akan default ke CultureInfo.CurrentCulture
. Lihat panggilan di sumber referensi , jika Anda mengikuti rangkaian panggilan, null akhirnya diganti dengan DateTimeFormatInfo.CurrentInfo
yang setara dengan CultureInfo.CurrentCulture
keluaran apa .
IFormatProvider memberikan info budaya ke metode yang dimaksud. DateTimeFormatInfo mengimplementasikan IFormatProvider, dan memungkinkan Anda untuk menentukan format yang Anda inginkan untuk menampilkan tanggal / waktu Anda. Contohnya dapat ditemukan pada halaman MSDN yang relevan.
Anda dapat melihat di sini http://msdn.microsoft.com/en-us/library/system.iformatprovider.aspx
Lihat bagian keterangan dan contoh di sana.
IFormatProvider
tidak digunakan IFormatProvider
.
Periksa http://msdn.microsoft.com/en-us/library/system.iformatprovider.aspx untuk mengetahui API.
Oleh MSDN
.NET Framework mencakup tiga implementasi IFormatProvider yang telah ditentukan sebelumnya untuk menyediakan informasi khusus budaya yang digunakan dalam pemformatan atau penguraian nilai numerik dan tanggal dan waktu:
NumberFormatInfo
kelas, yang menyediakan informasi yang digunakan untuk nomor Format, seperti mata uang, pemisah ribuan, dan simbol pemisah desimal untuk budaya tertentu. Untuk informasi tentang string format standar yang dikenali oleh NumberFormatInfo
objek dan digunakan dalam operasi pemformatan numerik, lihat String Format Numerik Standar dan String Format Numerik Kustom.DateTimeFormatInfo
kelas, yang menyediakan informasi yang digunakan untuk tanggal Format dan waktu, seperti tanggal dan waktu simbol pemisah untuk budaya tertentu atau urutan dan format komponen tahun, bulan, hari tanggal ini. Untuk informasi tentang string format yang sudah ditentukan sebelumnya yang dikenali oleh DateTimeFormatInfo
objek dan digunakan dalam operasi pemformatan numerik, lihat String Format Tanggal dan Waktu Standar dan String Format Tanggal dan Waktu Kustom.CultureInfo
kelas, yang mewakili budaya tertentu. Its GetFormat
metode mengembalikan budaya khusus NumberFormatInfo
atau DateTimeFormatInfo
objek, tergantung pada apakah CultureInfo
objek yang digunakan dalam operasi format atau parsing yang melibatkan angka atau tanggal dan waktu..NET Framework juga mendukung pemformatan kustom. Ini biasanya melibatkan pembuatan kelas pemformatan yang mengimplementasikan IFormatProvider dan ICustomFormatter. Sebuah instance dari kelas ini kemudian diteruskan sebagai parameter ke metode yang melakukan operasi pemformatan khusus, seperti String.Format(IFormatProvider, String, Object[])
.
Kelas DateTimeFormatInfo mengimplementasikan antarmuka ini, sehingga memungkinkan Anda untuk mengontrol pemformatan string DateTime Anda.