Mengurai string tanggal dan waktu di .NET

Mengurai string untuk mengonversinya ke DateTime objek mengharuskan Anda menentukan informasi tentang bagaimana tanggal dan waktu direpresentasikan sebagai teks. Budaya yang berbeda menggunakan pesanan yang berbeda untuk hari, bulan, dan tahun. Beberapa representasi waktu menggunakan jam 24 jam, yang lain menentukan "AM" dan "PM." Beberapa aplikasi hanya membutuhkan tanggal. Yang lain hanya membutuhkan waktu. Masih yang lain perlu menentukan tanggal dan waktu. Metode yang mengonversi string ke DateTime objek memungkinkan Anda memberikan informasi terperinci tentang format yang Anda harapkan dan elemen tanggal dan waktu yang dibutuhkan aplikasi Anda. Ada tiga subtugas untuk mengonversi teks dengan benar menjadi DateTime:

  1. Anda harus menentukan format teks yang diharapkan yang mewakili tanggal dan waktu.
  2. Anda dapat menentukan budaya untuk format waktu tanggal.
  3. Anda dapat menentukan bagaimana komponen yang hilang dalam representasi teks diatur dalam tanggal dan waktu.

Metode Parse dan TryParse mengonversi banyak representasi umum dari tanggal dan waktu. Metode ParseExact dan TryParseExact mengonversi representasi string yang sesuai dengan pola yang ditentukan oleh string format tanggal dan waktu. Untuk informasi selengkapnya, lihat artikel tentang string format tanggal dan waktu standar serta string format tanggal dan waktu kustom.

Objek saat ini DateTimeFormatInfo memberikan kontrol lebih besar atas bagaimana teks harus ditafsirkan sebagai tanggal dan waktu. Properti dari DateTimeFormatInfo menggambarkan pemisah tanggal dan waktu, nama bulan, hari, dan penghapusan, dan format untuk penyebutan "AM" dan "PM". yang CultureInfo dikembalikan oleh CultureInfo.CurrentCulture memiliki CultureInfo.DateTimeFormat properti yang mewakili budaya saat ini. Jika Anda menginginkan budaya atau pengaturan kustom tertentu, Anda menentukan IFormatProvider parameter metode penguraian. Untuk IFormatProvider parameter, tentukan CultureInfo objek, yang mewakili budaya, atau DateTimeFormatInfo objek.

Teks yang mewakili tanggal atau waktu mungkin kehilangan beberapa informasi. Misalnya, sebagian besar orang akan menganggap tanggal "12 Maret" mewakili tahun ini. Demikian pula, "Maret 2018" mewakili bulan Maret pada tahun 2018. Teks yang mewakili waktu sering kali hanya mencakup jam, menit, dan penunjukan AM/PM. Metode penguraian menangani informasi yang hilang ini dengan menggunakan default yang wajar:

  • Ketika hanya waktu yang ada, bagian tanggal menggunakan tanggal saat ini.
  • Ketika hanya tanggal yang ada, bagian waktunya adalah tengah malam.
  • Jika tahun tidak ditentukan dalam tanggal, digunakan tahun berjalan.
  • Ketika hari dalam sebulan tidak ditentukan, hari pertama bulan digunakan.

Jika tanggal ada dalam string, ia harus mencakup bulan dan salah satu hari atau tahun. Jika waktunya ada, ia harus mencakup jam, dan baik menit atau penyebut AM/PM.

Anda dapat menentukan NoCurrentDateDefault konstanta untuk mengambil alih default ini. Saat Anda menggunakan konstanta tersebut, properti tahun, bulan, atau hari yang hilang diatur ke nilai 1. Contoh terakhir yang menggunakan Parse menunjukkan perilaku ini.

Selain komponen tanggal dan waktu, representasi string dari tanggal dan waktu dapat mencakup offset yang menunjukkan seberapa banyak waktu berbeda dari Coordinated Universal Time (UTC). Misalnya, string "14/2/2007 5:32:00 -7:00" menentukan waktu tujuh jam lebih awal dari UTC. Jika offset dihilangkan dari representasi string waktu, penguraian mengembalikan DateTime objek dengan propertinya Kind diatur ke DateTimeKind.Unspecified. Jika offset ditentukan, penguraian mengembalikan DateTime objek dengan propertinya Kind diatur ke DateTimeKind.Local. Nilainya juga disesuaikan dengan zona waktu lokal komputer Anda. Anda dapat mengubah perilaku ini dengan menggunakan DateTimeStyles nilai dengan metode penguraian.

Penyedia format juga digunakan untuk menafsirkan tanggal numerik yang ambigu. Tidak jelas komponen tanggal mana yang diwakili oleh string "02/03/04" adalah bulan, hari, dan tahun. Komponen ditafsirkan sesuai dengan urutan format tanggal yang sama dalam penyedia format.

Pilah

Contoh berikut mengilustrasikan penggunaan DateTime.Parse metode untuk mengonversi string menjadi DateTime. Contoh ini menggunakan budaya yang terkait dengan utas saat ini. Jika yang CultureInfo terkait dengan budaya saat ini tidak dapat mengurai string input, akan FormatException dilemparkan.

Tip

Semua sampel C# dalam artikel ini berjalan di browser Anda. Tekan tombol Jalankan untuk melihat output. Anda juga dapat mengeditnya untuk bereksperimen sendiri.

Catatan

Contoh-contoh ini tersedia di repositori dokumen GitHub untuk C# dan Visual Basic.

string dateInput = "Jan 1, 2009";
var parsedDate = DateTime.Parse(dateInput);
Console.WriteLine(parsedDate);
// Displays the following output on a system whose culture is en-US:
//       1/1/2009 00:00:00
Dim MyString As String = "Jan 1, 2009"
Dim MyDateTime As DateTime = DateTime.Parse(MyString)
Console.WriteLine(MyDateTime)
' Displays the following output on a system whose culture is en-US:
'       1/1/2009 00:00:00

Anda juga dapat secara eksplisit menentukan budaya yang konvensi pemformatannya digunakan saat Mengurai string. Anda menentukan salah satu objek standar DateTimeFormatInfo yang dikembalikan oleh CultureInfo.DateTimeFormat properti. Contoh berikut menggunakan penyedia format untuk mengurai string Jerman menjadi DateTime. Ini menciptakan budaya yang CultureInfode-DE mewakili. Objek tersebut CultureInfo memastikan penguraian string khusus ini berhasil. Proses ini menghalangi pengaturan apa pun yang ada di CurrentCulture dari CurrentThread.

var cultureInfo = new CultureInfo("de-DE");
string dateString = "12 Juni 2008";
var dateTime = DateTime.Parse(dateString, cultureInfo);
Console.WriteLine(dateTime);
// The example displays the following output:
//       6/12/2008 00:00:00
Dim MyCultureInfo As New CultureInfo("de-DE")
Dim MyString As String = "12 Juni 2008"
Dim MyDateTime As DateTime = DateTime.Parse(MyString, MyCultureInfo)
Console.WriteLine(MyDateTime)
' The example displays the following output:
'       6/12/2008 00:00:00

Namun, Anda dapat menggunakan kelebihan beban Parse metode untuk menentukan penyedia format kustom. Metode Parse ini tidak mendukung penguraian format non-standar. Untuk mengurai tanggal dan waktu yang dinyatakan dalam format nonstandar, gunakan ParseExact metode sebagai gantinya.

Contoh berikut menggunakan DateTimeStyles enumerasi untuk menentukan bahwa informasi tanggal dan waktu saat ini tidak boleh ditambahkan ke DateTime bidang yang tidak ditentukan.

var cultureInfo = new CultureInfo("de-DE");
string dateString = "12 Juni 2008";
var dateTime = DateTime.Parse(dateString, cultureInfo,
                                DateTimeStyles.NoCurrentDateDefault);
Console.WriteLine(dateTime);
// The example displays the following output if the current culture is en-US:
//      6/12/2008 00:00:00
Dim MyCultureInfo As New CultureInfo("de-DE")
Dim MyString As String = "12 Juni 2008"
Dim MyDateTime As DateTime = DateTime.Parse(MyString, MyCultureInfo,
                           DateTimeStyles.NoCurrentDateDefault)
Console.WriteLine(MyDateTime)
' The example displays the following output if the current culture is en-US:
'       6/12/2008 00:00:00

ParseExact

Metode mengonversi DateTime.ParseExact string menjadi DateTime objek jika sesuai dengan salah satu pola string yang ditentukan. Ketika string yang bukan salah satu formulir yang ditentukan diteruskan ke metode ini, akan FormatException dilemparkan. Anda dapat menentukan salah satu penentu format tanggal dan waktu standar atau kombinasi dari penentu format kustom. Dengan menggunakan penentu format kustom, Anda dapat membuat string pengenalan kustom. Untuk penjelasan tentang penentu, lihat artikel tentang string format tanggal dan waktu standar serta string format tanggal dan waktu kustom.

Dalam contoh berikut, DateTime.ParseExact metode diteruskan objek string untuk diurai, diikuti dengan penentu format, diikuti oleh CultureInfo objek. Metode ini ParseExact hanya dapat mengurai string yang mengikuti pola tanggal panjang dalam en-US budaya.

var cultureInfo = new CultureInfo("en-US");
string[] dateStrings = { " Friday, April 10, 2009", "Friday, April 10, 2009" };
foreach (string dateString in dateStrings)
{
    try
    {
        var dateTime = DateTime.ParseExact(dateString, "D", cultureInfo);
        Console.WriteLine(dateTime);
    }
    catch (FormatException)
    {
        Console.WriteLine("Unable to parse '{0}'", dateString);
    }
}
// The example displays the following output:
//       Unable to parse ' Friday, April 10, 2009'
//       4/10/2009 00:00:00
Dim MyCultureInfo As New CultureInfo("en-US")
Dim MyString() As String = {" Friday, April 10, 2009", "Friday, April 10, 2009"}
For Each dateString As String In MyString
    Try
        Dim MyDateTime As DateTime = DateTime.ParseExact(dateString, "D",
                                                     MyCultureInfo)
        Console.WriteLine(MyDateTime)
    Catch e As FormatException
        Console.WriteLine("Unable to parse '{0}'", dateString)
    End Try
Next
' The example displays the following output:
'       Unable to parse ' Friday, April 10, 2009'
'       4/10/2009 00:00:00

Setiap kelebihan beban metode Parse dan ParseExact juga memiliki IFormatProvider parameter yang menyediakan informasi khusus budaya tentang pemformatan string. Objek IFormatProvider adalah CultureInfo objek yang mewakili budaya standar atau DateTimeFormatInfo objek yang dikembalikan oleh CultureInfo.DateTimeFormat properti . ParseExact juga menggunakan argumen string atau array string tambahan yang menentukan satu atau beberapa format tanggal dan waktu kustom.

Lihat juga