Bagikan melalui


Mengurai string tanggal dan waktu di .NET

Mengurai string untuk mengonversinya ke objek DateTime mengharuskan Anda menentukan informasi tentang bagaimana tanggal dan waktu diwakili 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 memerlukan tanggal. Yang lain hanya membutuhkan waktu. Masih yang lain perlu menentukan tanggal dan waktu. Metode yang mengonversi string menjadi objek DateTime 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 dan string format tanggal dan waktu kustom.

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

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 waktu adalah tengah malam.
  • Ketika tahun tidak ditentukan dalam tanggal, tahun saat ini digunakan.
  • Ketika hari dalam sebulan tidak ditentukan, hari pertama bulan digunakan.

Jika tanggal ada dalam string, harus menyertakan bulan dan salah satu hari atau tahun. Jika waktu diberikan, waktu harus mencakup jam, dan menit atau penunjuk AM/PM.

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

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

Penyedia format juga digunakan untuk menginterpretasikan tanggal numerik 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 serupa dalam penyedia format.

Memparsing

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

Petunjuk / Saran

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

Nota

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 Anda mengurai string. Anda menentukan salah satu objek DateTimeFormatInfo standar yang dikembalikan oleh properti CultureInfo.DateTimeFormat. Contoh berikut menggunakan penyedia format untuk mengurai string Jerman ke dalam DateTime. Ini menciptakan CultureInfo yang mewakili budaya de-DE. Objek CultureInfo tersebut memastikan penguraian string khusus ini berhasil. Proses ini menggantikan 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 metode Parse untuk menentukan penyedia format kustom. Metode Parse tidak mendukung penguraian format non-standar. Untuk mengurai tanggal dan waktu yang dinyatakan dalam format non-standar, gunakan metode ParseExact sebagai gantinya.

Contoh berikut menggunakan enumerasi DateTimeStyles untuk menentukan bahwa informasi tanggal dan waktu saat ini tidak boleh ditambahkan ke DateTime untuk 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 DateTime.ParseExact mengonversi string menjadi objek DateTime jika sesuai dengan salah satu pola string yang ditentukan. Ketika string yang bukan salah satu bentuk yang ditentukan diteruskan ke metode ini, FormatException dilempar. Anda dapat menentukan salah satu penentu format tanggal dan waktu standar atau kombinasi penentu format kustom. Dengan menggunakan penentu format kustom, Anda dapat membuat string pengenalan kustom. Untuk penjelasan tentang penentu-penentu, lihat artikel tentang string-format tanggal dan waktu standar dan serta string-format tanggal dan waktu kustom dan.

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

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 '{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 parameter IFormatProvider yang menyediakan informasi terkait budaya tentang cara pemformatan string. Objek IFormatProvider adalah objek CultureInfo yang mewakili budaya standar atau objek DateTimeFormatInfo yang dikembalikan oleh properti CultureInfo.DateTimeFormat. ParseExact juga menggunakan argumen string atau array string tambahan yang menentukan satu atau beberapa format tanggal dan waktu kustom.

Lihat juga