Bagikan melalui


Mengurai string tanggal dan waktu di .NET

.NET menyediakan beberapa jenis untuk bekerja dengan data tanggal dan waktu, masing-masing dioptimalkan untuk skenario yang berbeda:

  • DateTime - Mewakili tanggal dan waktu bersama-sama, ideal ketika Anda membutuhkan kedua komponen atau ketika bekerja dengan kode warisan.
  • DateOnly (tidak tersedia dalam .NET Framework) - Hanya mewakili tanggal tanpa informasi waktu, sempurna untuk ulang tahun, hari jadi, atau tanggal bisnis.
  • TimeOnly (tidak tersedia dalam .NET Framework) - Hanya mewakili waktu tanpa informasi tanggal, ideal untuk jadwal, alarm, atau peristiwa harian berulang.

Setiap jenis menyediakan metode penguraian yang mengonversi string ke objek masing-masing, dengan tingkat fleksibilitas dan kontrol yang berbeda atas proses penguraian.

Konsep penguraian umum

Ketiga jenis tanggal dan waktu berbagi pendekatan penguraian serupa:

  • Parse dan TryParse metode - Mengonversi banyak representasi string umum menggunakan budaya saat ini atau pengaturan budaya yang ditentukan.
  • ParseExact dan TryParseExact metode - Mengonversi string yang sesuai dengan pola format tertentu, memberikan kontrol yang tepat atas format yang diharapkan, termasuk pengaturan budaya.
  • Format string - Tentukan pola untuk penguraian menggunakan penentu format standar atau kustom.

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." Metode penguraian menangani variasi ini melalui aturan pemformatan khusus budaya.

Objek DateTimeFormatInfo menyediakan kontrol atas bagaimana teks harus ditafsirkan. Properti menjelaskan pemisah tanggal dan waktu, nama bulan, hari, era, dan format untuk penunjukan "AM" dan "PM". Anda dapat menentukan budaya melalui IFormatProvider parameter menggunakan CultureInfo objek atau DateTimeFormatInfo objek.

Untuk informasi selengkapnya tentang pola format, lihat string format tanggal dan waktu standar serta string format tanggal dan waktu kustom.

Penting

DateOnly dan TimeOnly jenis tidak tersedia untuk .NET Framework.

Penguraian Tanggal dan Waktu (DateTime)

DateTime mewakili komponen tanggal dan waktu bersama-sama. Saat mengurai string ke DateTime objek, Anda perlu mempertimbangkan beberapa DateTimeaspek khusus:

  • Penanganan informasi yang hilang - DateTime menggunakan default ketika bagian hilang dari string input.
  • Dukungan - DateTime dapat mewakili zona waktu lokal, UTC, atau tidak ditentukan.
  • Penguraian tanggal dan waktu gabungan - Harus menangani komponen tanggal dan waktu dalam satu operasi.

Penanganan informasi yang hilang

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. DateTime 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.

Offset UTC dan pengelolaan zona waktu

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.

Penanganan tanggal ambigu

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.

DateTime.Parse

Contoh berikut menunjukkan 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.

static void DateTimeParseExample()
{
    // Parse common date and time formats using current culture
    var dateTime1 = DateTime.Parse("1/15/2025 3:30 PM");
    var dateTime2 = DateTime.Parse("January 15, 2025");
    var dateTime3 = DateTime.Parse("15:30:45");

    Console.WriteLine($"Parsed: {dateTime1}");
    Console.WriteLine($"Parsed: {dateTime2}");
    Console.WriteLine($"Parsed: {dateTime3}");

    // Parse with specific culture
    var germanDate = DateTime.Parse("15.01.2025", new CultureInfo("de-DE"));
    Console.WriteLine($"German date parsed: {germanDate}");
}
Sub DateTimeParseExample()
    ' Parse common date and time formats using current culture
    Dim dateTime1 = DateTime.Parse("1/15/2025 3:30 PM")
    Dim dateTime2 = DateTime.Parse("January 15, 2025")
    Dim dateTime3 = DateTime.Parse("15:30:45")

    Console.WriteLine($"Parsed: {dateTime1}")
    Console.WriteLine($"Parsed: {dateTime2}")
    Console.WriteLine($"Parsed: {dateTime3}")

    ' Parse with specific culture
    Dim germanDate = DateTime.Parse("15.01.2025", New CultureInfo("de-DE"))
    Console.WriteLine($"German date parsed: {germanDate}")
End Sub

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.

static void DateTimeParseGermanExample()
{
    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
}
Sub DateTimeParseGermanExample()
    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
End Sub

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.

static void DateTimeParseNoDefaultExample()
{
    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
}
Sub DateTimeParseNoDefaultExample()
    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
End Sub

DateTime.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.

static void DateTimeParseExactExample()
{
    // Parse exact format
    var exactDate = DateTime.ParseExact("2025-01-15T14:30:00", "yyyy-MM-ddTHH:mm:ss", CultureInfo.InvariantCulture);
    Console.WriteLine($"Exact parse: {exactDate}");

    // Parse with custom format
    var customDate = DateTime.ParseExact("15/Jan/2025 2:30 PM", "dd/MMM/yyyy h:mm tt", CultureInfo.InvariantCulture);
    Console.WriteLine($"Custom format: {customDate}");
}
Sub DateTimeParseExactExample()
    ' Parse exact format
    Dim exactDate = DateTime.ParseExact("2025-01-15T14:30:00", "yyyy-MM-ddTHH:mm:ss", CultureInfo.InvariantCulture)
    Console.WriteLine($"Exact parse: {exactDate}")

    ' Parse with custom format
    Dim customDate = DateTime.ParseExact("15/Jan/2025 2:30 PM", "dd/MMM/yyyy h:mm tt", CultureInfo.InvariantCulture)
    Console.WriteLine($"Custom format: {customDate}")
End Sub

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.

Penguraian DateOnly

Struktur DateOnly hanya mewakili tanggal tanpa informasi waktu, membuatnya sempurna untuk skenario seperti ulang tahun, hari jadi, atau tanggal bisnis. Karena tidak memiliki komponen waktu, itu menunjukkan tanggal dari awal hari hingga akhir hari.

DateOnly memiliki beberapa kelebihan dibandingkan menggunakan DateTime untuk skenario hanya tanggal:

  • Struktur DateTime mungkin bergulir ke hari sebelumnya atau berikutnya jika diimbangi oleh zona waktu. DateOnly tidak dapat diimbangi oleh zona waktu, dan selalu mewakili tanggal yang ditetapkan.
  • Menserialisasikan DateOnly menyertakan lebih sedikit data daripada DateTime.
  • Saat kode berinteraksi dengan database, seperti SQL Server, seluruh tanggal umumnya disimpan sebagai date jenis data, yang tidak menyertakan waktu. DateOnly mencocokkan jenis database dengan lebih baik.

DateOnly.Parse

Metode ini DateOnly.Parse mengonversi representasi string tanggal umum menjadi DateOnly objek. Metode ini menerima berbagai format dan menggunakan budaya saat ini atau budaya tertentu untuk penguraian.

static void DateOnlyParseExample()
{
    // Parse common date formats
    var date1 = DateOnly.Parse("1/15/2025");
    var date2 = DateOnly.Parse("January 15, 2025", CultureInfo.InvariantCulture);
    var date3 = DateOnly.Parse("2025-01-15");

    Console.WriteLine($"Parsed date: {date1}");
    Console.WriteLine($"Parsed date: {date2.ToString("D")}"); // Long date format
    Console.WriteLine($"Parsed date: {date3.ToString("yyyy-MM-dd")}");

    // Parse with specific culture
    var germanDate = DateOnly.Parse("15.01.2025", new CultureInfo("de-DE"));
    Console.WriteLine($"German date: {germanDate}");
}
Sub DateOnlyParseExample()
    ' Parse common date formats
    Dim date1 = DateOnly.Parse("1/15/2025")
    Dim date2 = DateOnly.Parse("January 15, 2025", CultureInfo.InvariantCulture)
    Dim date3 = DateOnly.Parse("2025-01-15")

    Console.WriteLine($"Parsed date: {date1}")
    Console.WriteLine($"Parsed date: {date2.ToString("D")}") ' Long date format
    Console.WriteLine($"Parsed date: {date3.ToString("yyyy-MM-dd")}")

    ' Parse with specific culture
    Dim germanDate = DateOnly.Parse("15.01.2025", New CultureInfo("de-DE"))
    Console.WriteLine($"German date: {germanDate}")
End Sub

DateOnly.ParseExact (menguraikan tanggal dengan format yang tepat)

Metode ini DateOnly.ParseExact memberikan kontrol yang tepat atas format string input yang diharapkan. Gunakan metode ini ketika Anda mengetahui format string tanggal yang tepat dan ingin memastikan penguraian yang ketat.

static void DateOnlyParseExactExample()
{
    // Parse exact format
    var exactDate = DateOnly.ParseExact("21 Oct 2015", "dd MMM yyyy", CultureInfo.InvariantCulture);
    Console.WriteLine($"Exact date: {exactDate}");

    // Parse ISO format
    var isoDate = DateOnly.ParseExact("2025-01-15", "yyyy-MM-dd", CultureInfo.InvariantCulture);
    Console.WriteLine($"ISO date: {isoDate}");

    // Parse with multiple possible formats
    string[] formats = { "MM/dd/yyyy", "M/d/yyyy", "dd/MM/yyyy" };
    var flexibleDate = DateOnly.ParseExact("1/15/2025", formats, CultureInfo.InvariantCulture, DateTimeStyles.None);
    Console.WriteLine($"Flexible parse: {flexibleDate}");
}
Sub DateOnlyParseExactExample()
    ' Parse exact format
    Dim exactDate = DateOnly.ParseExact("21 Oct 2015", "dd MMM yyyy", CultureInfo.InvariantCulture)
    Console.WriteLine($"Exact date: {exactDate}")

    ' Parse ISO format
    Dim isoDate = DateOnly.ParseExact("2025-01-15", "yyyy-MM-dd", CultureInfo.InvariantCulture)
    Console.WriteLine($"ISO date: {isoDate}")

    ' Parse with multiple possible formats
    Dim formats() As String = {"MM/dd/yyyy", "M/d/yyyy", "dd/MM/yyyy"}
    Dim flexibleDate = DateOnly.ParseExact("1/15/2025", formats, CultureInfo.InvariantCulture, DateTimeStyles.None)
    Console.WriteLine($"Flexible parse: {flexibleDate}")
End Sub

Metode ParseExact ini menerima baik satu string format atau array dari string format, sehingga memungkinkan Anda untuk mengurai tanggal yang mungkin datang dalam berbagai format yang dapat diterima.

Penguraian TimeOnly

Struktur TimeOnly mewakili nilai waktu dalam sehari, seperti alarm harian atau waktu makan siang setiap hari. TimeOnly dibatasi pada rentang 00:00:00.0000000 - 23:59:59.9999999, waktu tertentu dalam sehari.

TimeOnly memecahkan beberapa masalah yang ada saat menggunakan jenis lain untuk skenario yang hanya berfokus pada waktu:

  • TimeSpan mewakili waktu yang berlalu dan bisa negatif atau melebihi 24 jam, membuatnya tidak cocok untuk mewakili waktu tertentu dalam sehari.
  • Menggunakan DateTime untuk waktu tertentu dalam sehari memerlukan tanggal arbitrer, yang dapat menyebabkan hasil tak terduga saat melakukan penghitungan.
  • TimeOnly dengan otomatis menangani rollover 24 jam saat menambahkan atau mengurangi nilai waktu.

TimeOnly.Parse

Metode TimeOnly.Parse mengonversi representasi string waktu umum menjadi objek TimeOnly. Metode ini menerima berbagai format termasuk notasi 12 jam dan 24 jam.

static void TimeOnlyParseExample()
{
    // Parse common time formats
    var time1 = TimeOnly.Parse("14:30:15");
    var time2 = TimeOnly.Parse("2:30 PM", CultureInfo.InvariantCulture);
    var time3 = TimeOnly.Parse("17:45");

    Console.WriteLine($"Parsed time: {time1}");
    Console.WriteLine($"Parsed time: {time2.ToString("t")}"); // Short time format
    Console.WriteLine($"Parsed time: {time3.ToString("HH:mm")}");

    // Parse with milliseconds
    var preciseTime = TimeOnly.Parse("14:30:15.123");
    Console.WriteLine($"Precise time: {preciseTime.ToString("HH:mm:ss.fff")}");
}
Sub TimeOnlyParseExample()
    ' Parse common time formats
    Dim time1 = TimeOnly.Parse("14:30:15")
    Dim time2 = TimeOnly.Parse("2:30 PM", CultureInfo.InvariantCulture)
    Dim time3 = TimeOnly.Parse("17:45")

    Console.WriteLine($"Parsed time: {time1}")
    Console.WriteLine($"Parsed time: {time2.ToString("t")}") ' Short time format
    Console.WriteLine($"Parsed time: {time3.ToString("HH:mm")}")

    ' Parse with milliseconds
    Dim preciseTime = TimeOnly.Parse("14:30:15.123")
    Console.WriteLine($"Precise time: {preciseTime.ToString("HH:mm:ss.fff")}")
End Sub

TimeOnly.ParseExact

Metode ini TimeOnly.ParseExact memberikan kontrol yang tepat atas format string waktu input yang diharapkan. Gunakan metode ini ketika Anda mengetahui format yang tepat dan ingin memastikan penguraian yang ketat.

static void TimeOnlyParseExactExample()
{
    // Parse exact format
    var exactTime = TimeOnly.ParseExact("5:00 pm", "h:mm tt", CultureInfo.InvariantCulture);
    Console.WriteLine($"Exact time: {exactTime}");

    // Parse 24-hour format
    var militaryTime = TimeOnly.ParseExact("17:30:25", "HH:mm:ss", CultureInfo.InvariantCulture);
    Console.WriteLine($"Military time: {militaryTime}");

    // Parse with multiple possible formats
    string[] timeFormats = { "h:mm tt", "HH:mm", "H:mm" };
    var flexibleTime = TimeOnly.ParseExact("2:30 PM", timeFormats, CultureInfo.InvariantCulture, DateTimeStyles.None);
    Console.WriteLine($"Flexible time parse: {flexibleTime}");
}
Sub TimeOnlyParseExactExample()
    ' Parse exact format
    Dim exactTime = TimeOnly.ParseExact("5:00 pm", "h:mm tt", CultureInfo.InvariantCulture)
    Console.WriteLine($"Exact time: {exactTime}")

    ' Parse 24-hour format
    Dim militaryTime = TimeOnly.ParseExact("17:30:25", "HH:mm:ss", CultureInfo.InvariantCulture)
    Console.WriteLine($"Military time: {militaryTime}")

    ' Parse with multiple possible formats
    Dim timeFormats() As String = {"h:mm tt", "HH:mm", "H:mm"}
    Dim flexibleTime = TimeOnly.ParseExact("2:30 PM", timeFormats, CultureInfo.InvariantCulture, DateTimeStyles.None)
    Console.WriteLine($"Flexible time parse: {flexibleTime}")
End Sub

Lihat juga