Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Artikel ini menyediakan keterangan tambahan untuk dokumentasi referensi untuk API ini.
Penting
Era dalam kalender Jepang didasarkan pada pemerintahan kaisar dan oleh karena itu diharapkan untuk berubah. Misalnya, 1 Mei 2019 menandai awal era Reiwa di JapaneseCalendar dan JapaneseLunisolarCalendar. Perubahan era seperti itu memengaruhi semua aplikasi yang menggunakan kalender ini. Untuk informasi selengkapnya dan untuk menentukan apakah aplikasi Anda terpengaruh, lihat Menangani era baru di kalender Jepang di .NET. Untuk informasi tentang menguji aplikasi Anda pada sistem Windows untuk memastikan kesiapan mereka untuk perubahan era, lihat Menyiapkan aplikasi Anda untuk perubahan era Jepang. Untuk fitur di .NET yang mendukung kalender dengan beberapa era dan untuk praktik terbaik saat bekerja dengan kalender yang mendukung beberapa era, lihat Bekerja dengan era.
Gambaran Umum
Jenis nilai DateTime mewakili tanggal dan waktu dengan nilai mulai dari 00:00:00 (tengah malam), 1 Januari 0001 Anno Domini (Era Umum) hingga 11:59:59 P.M., 31 Desember 9999 A.D. (C.E.) dalam kalender Gregorian.
Nilai waktu diukur dalam unit 100 nanodetik yang disebut tick. Tanggal tertentu adalah jumlah detik sejak pukul 12:00 tengah malam, 1 Januari 0001 Masehi dalam kalender GregorianCalendar. Angka ini mengecualikan hitungan waktu yang akan ditambahkan oleh detik kabisat. Misalnya, nilai ticks 31241376000000000L menunjukkan tanggal Jumat, 01 Januari 0100 12:00:00 tengah malam. Nilai DateTime selalu dinyatakan dalam konteks kalender eksplisit atau default.
Nota
Jika Anda bekerja dengan nilai tanda centang yang ingin Anda konversi ke interval waktu lain, seperti menit atau detik, Anda harus menggunakan TimeSpan.TicksPerDay, TimeSpan.TicksPerHour, TimeSpan.TicksPerMinute, TimeSpan.TicksPerSecond, atau konstanta TimeSpan.TicksPerMillisecond untuk melakukan konversi. Misalnya, untuk menambahkan jumlah detik yang diwakili oleh jumlah tanda centang tertentu ke komponen Second dari nilai DateTime, Anda dapat menggunakan ekspresi dateValue.Second + nTicks/Timespan.TicksPerSecond.
Nota
Alternatif untuk struktur DateTime untuk bekerja dengan nilai tanggal dan waktu di zona waktu tertentu adalah struktur DateTimeOffset. Struktur DateTimeOffset menyimpan informasi tanggal dan waktu di bidang DateTime privat dan jumlah menit di mana tanggal dan waktu tersebut berbeda dari UTC di bidang Int16 privat. Ini memungkinkan nilai DateTimeOffset untuk mencerminkan waktu di zona waktu tertentu, sedangkan nilai DateTime dapat secara tidak ambigu hanya mencerminkan UTC dan waktu zona waktu lokal. Untuk diskusi tentang kapan menggunakan struktur DateTime atau struktur DateTimeOffset saat bekerja dengan nilai tanggal dan waktu, lihat Memilih Antara DateTime, DateTimeOffset, TimeSpan, dan TimeZoneInfo.
Tautan cepat ke contoh kode
Nota
Beberapa contoh C# dalam artikel ini dijalankan menggunakan Try.NET seperti inline code runner dan playground. Pilih tombol Jalankan untuk menjalankan contoh di jendela interaktif. Setelah menjalankan kode, Anda dapat memodifikasinya dan menjalankan kode yang dimodifikasi dengan memilih Jalankan lagi. Kode yang dimodifikasi berjalan di jendela interaktif atau, jika kompilasi gagal, jendela interaktif menampilkan semua pesan kesalahan pengkompilasi C#.
Zona waktu lokal dari barisan kode runner dan playground Try.NET adalah Waktu Universal Terkoordinasi, atau UTC. Hal ini dapat memengaruhi perilaku dan output contoh yang mengilustrasikan jenis DateTime, DateTimeOffset, dan TimeZoneInfo serta anggotanya.
Artikel ini menyertakan beberapa contoh yang menggunakan jenis DateTime:
Contoh inisialisasi
- Memanggil konstruktor
- Memanggil konstruktor tanpa parameter implisit
- penugasan dari nilai pengembalian
- Mengurai string yang mewakili tanggal dan waktu
- sintaks Visual Basic untuk menginisialisasi tanggal dan waktu
Format objek DateTime sebagai contoh string
- Gunakan format waktu tanggal default
- Memformat tanggal dan waktu menggunakan budaya tertentu
- Memformat waktu tanggal menggunakan string format standar atau kustom
- Tentukan string format dan budaya tertentu
- Memformat waktu tanggal menggunakan standar ISO 8601 untuk layanan web
Mengurai string sebagai contoh objek DateTime
-
Gunakan
ParseatauTryParseuntuk mengonversi string menjadi tanggal dan waktu -
Gunakan
ParseExactatauTryParseExactuntuk mengonversi string dalam format yang diketahui - Konversi dari representasi string ISO 8601 menjadi tanggal dan waktu
contoh resolusi DateTime
Contoh budaya dan kalender
- Menampilkan nilai tanggal dan waktu menggunakan kalender tertentu budaya
- Mengurai string sesuai dengan kalender spesifik budaya
- Menginisialisasi tanggal dan waktu dari kalender budaya tertentu
- Mengakses properti tanggal dan waktu menggunakan kalender budaya tertentu
- Mengambil minggu dalam setahun menggunakan kalender khusus budaya
Contoh persistensi
- Mempertahankan nilai tanggal dan waktu sebagai string di zona waktu lokal
- Mempertahankan nilai tanggal dan waktu sebagai string dalam format yang tidak dipengaruhi budaya dan waktu
- Mempertahankan nilai tanggal dan waktu sebagai bilangan bulat
-
Penyimpanan nilai tanggal dan waktu menggunakan
XmlSerializer
Menginisialisasi objek DateTime
Anda dapat menetapkan nilai awal ke nilai DateTime baru dengan berbagai cara:
- Memanggil konstruktor, baik di mana Anda menentukan argumen untuk nilai, atau menggunakan konstruktor tanpa parameter implisit.
- Menetapkan nilai
DateTimepada nilai pengembalian dari suatu properti atau metode. - Mengurai nilai
DateTimedari representasi stringnya. - Menggunakan fitur bahasa khusus Visual Basic untuk menginstansiasi
DateTime.
Cuplikan kode berikut menunjukkan contoh masing-masing.
Memanggil konstruktor
Anda memanggil salah satu kelebihan beban konstruktor DateTime yang menentukan elemen nilai tanggal dan waktu (seperti tahun, bulan, dan hari, atau jumlah tanda centang). Kode berikut membuat tanggal tertentu menggunakan konstruktor DateTime yang menentukan tahun, bulan, hari, jam, menit, dan detik.
Dim date1 As New Date(2008, 5, 1, 8, 30, 52)
var date1 = new DateTime(2008, 5, 1, 8, 30, 52);
Console.WriteLine(date1);
let date1 = DateTime(2008, 5, 1, 8, 30, 52)
printfn $"{date1}"
Anda memanggil konstruktor tanpa parameter implisit struktur DateTime saat Anda ingin DateTime diinisialisasi ke nilai defaultnya. (Untuk detail tentang konstruktor tanpa parameter implisit dari jenis nilai, lihat Jenis Nilai.) Beberapa kompilator juga mendukung mendeklarasikan nilai DateTime tanpa secara eksplisit menetapkan nilai ke nilai tersebut. Membuat nilai tanpa inisialisasi eksplisit juga menghasilkan nilai default. Contoh berikut mengilustrasikan konstruktor tanpa parameter implisit DateTime di C# dan Visual Basic, serta deklarasi DateTime tanpa penugasan di Visual Basic.
Dim dat1 As DateTime
' The following method call displays 1/1/0001 12:00:00 AM.
Console.WriteLine(dat1.ToString(System.Globalization.CultureInfo.InvariantCulture))
' The following method call displays True.
Console.WriteLine(dat1.Equals(Date.MinValue))
Dim dat2 As New DateTime()
' The following method call displays 1/1/0001 12:00:00 AM.
Console.WriteLine(dat2.ToString(System.Globalization.CultureInfo.InvariantCulture))
' The following method call displays True.
Console.WriteLine(dat2.Equals(Date.MinValue))
var dat1 = new DateTime();
// The following method call displays 1/1/0001 12:00:00 AM.
Console.WriteLine(dat1.ToString(System.Globalization.CultureInfo.InvariantCulture));
// The following method call displays True.
Console.WriteLine(dat1.Equals(DateTime.MinValue));
let dat1 = DateTime()
// The following method call displays 1/1/0001 12:00:00 AM.
printfn $"{dat1.ToString System.Globalization.CultureInfo.InvariantCulture}"
// The following method call displays True.
printfn $"{dat1.Equals DateTime.MinValue}"
Menetapkan nilai komputasi
Anda dapat menetapkan objek DateTime nilai tanggal dan waktu yang dikembalikan oleh properti atau metode. Contoh berikut menetapkan tanggal dan waktu saat ini, tanggal dan waktu Waktu Universal Terkoordinasi (UTC) saat ini, dan tanggal saat ini ke tiga variabel DateTime baru.
Dim date1 As Date = Date.Now
Dim date2 As Date = Date.UtcNow
Dim date3 As Date = Date.Today
DateTime date1 = DateTime.Now;
DateTime date2 = DateTime.UtcNow;
DateTime date3 = DateTime.Today;
let date1 = DateTime.Now
let date2 = DateTime.UtcNow
let date3 = DateTime.Today
Menguraikan string yang mewakili tanggal dan waktu
Metode Parse, ParseExact, TryParse, dan TryParseExact semuanya mengonversi string ke nilai tanggal dan waktu yang setara. Contoh berikut menggunakan metode Parse dan ParseExact untuk mengurai string dan mengonversinya menjadi nilai DateTime. Format kedua menggunakan formulir yang didukung oleh standar ISO 8601 untuk tanggal dan waktu yang mewakili dalam format string. Representasi standar ini sering digunakan untuk mentransfer informasi tanggal di layanan web.
Dim dateString As String = "5/1/2008 8:30:52 AM"
Dim date1 As Date = Date.Parse(dateString,
System.Globalization.CultureInfo.InvariantCulture)
Dim iso8601String As String = "20080501T08:30:52Z"
Dim dateISO8602 As Date = DateTime.ParseExact(iso8601String, "yyyyMMddTHH:mm:ssZ",
System.Globalization.CultureInfo.InvariantCulture)
Console.WriteLine(dateISO8602)
var dateString = "5/1/2008 8:30:52 AM";
DateTime date1 = DateTime.Parse(dateString,
System.Globalization.CultureInfo.InvariantCulture);
var iso8601String = "20080501T08:30:52Z";
DateTime dateISO8602 = DateTime.ParseExact(iso8601String, "yyyyMMddTHH:mm:ssZ",
System.Globalization.CultureInfo.InvariantCulture);
let dateString = "5/1/2008 8:30:52 AM"
let date1 = DateTime.Parse(dateString, System.Globalization.CultureInfo.InvariantCulture)
let iso8601String = "20080501T08:30:52Z"
let dateISO8602 = DateTime.ParseExact(iso8601String, "yyyyMMddTHH:mm:ssZ", System.Globalization.CultureInfo.InvariantCulture)
Metode TryParse dan TryParseExact menunjukkan apakah string adalah representasi yang valid dari nilai DateTime dan, jika ya, melakukan konversi.
Sintaksis khusus bahasa untuk Visual Basic
Pernyataan Visual Basic berikut menginisialisasi nilai DateTime baru.
Dim date1 As Date = #5/1/2008 8:30:52AM#
Nilai DateTime dan representasi stringnya
Secara internal, semua nilai DateTime diwakili sebagai jumlah tick (jumlah interval 100 nanodetik) yang telah berlalu sejak 12:00:00 tengah malam, 1 Januari 0001. Nilai DateTime aktual tidak bergantung pada cara nilai tersebut muncul saat ditampilkan. Tampilan nilai DateTime adalah hasil dari operasi pemformatan yang mengonversi nilai ke representasi stringnya.
Munculnya nilai tanggal dan waktu tergantung pada budaya, standar internasional, persyaratan aplikasi, dan preferensi pribadi. Struktur DateTime menawarkan fleksibilitas dalam memformat nilai tanggal dan waktu melalui kelebihan beban ToString. Metode DateTime.ToString() default mengembalikan representasi string dari nilai tanggal dan waktu menggunakan pola tanggal pendek dan waktu panjang budaya saat ini. Contoh berikut menggunakan metode DateTime.ToString() default. Ini menampilkan tanggal dan waktu menggunakan tanggal pendek dan pola waktu yang lama untuk budaya saat ini. Budaya en-US adalah budaya saat ini di komputer tempat contoh dijalankan.
var date1 = new DateTime(2008, 3, 1, 7, 0, 0);
Console.WriteLine(date1.ToString());
// For en-US culture, displays 3/1/2008 7:00:00 AM
let date1 = DateTime(2008, 3, 1, 7, 0, 0)
printfn $"{date1.ToString()}"
// For en-US culture, displays 3/1/2008 7:00:00 AM
Dim date1 As Date = #3/1/2008 7:00AM#
Console.WriteLine(date1.ToString())
' For en-US culture, displays 3/1/2008 7:00:00 AM
Anda mungkin perlu memformat tanggal dalam budaya tertentu untuk mendukung skenario web di mana server mungkin berada dalam budaya yang berbeda dari klien. Anda menentukan budaya menggunakan metode DateTime.ToString(IFormatProvider) untuk membuat representasi tanggal pendek dan waktu yang lama dalam budaya tertentu. Contoh berikut menggunakan metode DateTime.ToString(IFormatProvider) untuk menampilkan tanggal dan waktu menggunakan pola tanggal pendek dan waktu panjang untuk budaya fr-FR.
var date1 = new DateTime(2008, 3, 1, 7, 0, 0);
Console.WriteLine(date1.ToString(System.Globalization.CultureInfo.CreateSpecificCulture("fr-FR")));
// Displays 01/03/2008 07:00:00
let date1 = DateTime(2008, 3, 1, 7, 0, 0)
printfn $"""{date1.ToString(System.Globalization.CultureInfo.CreateSpecificCulture "fr-FR")}"""
// Displays 01/03/2008 07:00:00
Dim date1 As Date = #3/1/2008 7:00AM#
Console.WriteLine(date1.ToString(System.Globalization.CultureInfo.CreateSpecificCulture("fr-FR")))
' Displays 01/03/2008 07:00:00
Aplikasi lain mungkin memerlukan representasi string yang berbeda dari tanggal. Metode DateTime.ToString(String) mengembalikan representasi string yang ditentukan oleh penentu format standar atau kustom menggunakan konvensi pemformatan budaya saat ini. Contoh berikut menggunakan metode DateTime.ToString(String) untuk menampilkan pola tanggal dan waktu penuh untuk budaya en-US, budaya saat ini di komputer tempat contoh dijalankan.
var date1 = new DateTime(2008, 3, 1, 7, 0, 0);
Console.WriteLine(date1.ToString("F"));
// Displays Saturday, March 01, 2008 7:00:00 AM
let date1 = DateTime(2008, 3, 1, 7, 0, 0)
printfn $"""{date1.ToString "F"}"""
// Displays Saturday, March 01, 2008 7:00:00 AM
Dim date1 As Date = #3/1/2008 7:00AM#
Console.WriteLine(date1.ToString("F"))
' Displays Saturday, March 01, 2008 7:00:00 AM
Terakhir, Anda dapat menentukan budaya dan format menggunakan metode DateTime.ToString(String, IFormatProvider). Contoh berikut menggunakan metode DateTime.ToString(String, IFormatProvider) untuk menampilkan pola tanggal dan waktu penuh untuk budaya fr-FR.
var date1 = new DateTime(2008, 3, 1, 7, 0, 0);
Console.WriteLine(date1.ToString("F", new System.Globalization.CultureInfo("fr-FR")));
// Displays samedi 1 mars 2008 07:00:00
let date1 = DateTime(2008, 3, 1, 7, 0, 0)
printfn $"""{date1.ToString("F", new System.Globalization.CultureInfo "fr-FR")}"""
// Displays samedi 1 mars 2008 07:00:00
Dim date1 As Date = #3/1/2008 7:00AM#
Console.WriteLine(date1.ToString("F", New System.Globalization.CultureInfo("fr-FR")))
' Displays samedi 1 mars 2008 07:00:00
Overload DateTime.ToString(String) juga bisa digunakan untuk menentukan format lain dengan string format kustom. Contoh berikut menunjukkan cara memformat string menggunakan format standar ISO 8601 sering digunakan untuk layanan web. Format Iso 8601 tidak memiliki string format standar yang sesuai.
var date1 = new DateTime(2008, 3, 1, 7, 0, 0, DateTimeKind.Utc);
Console.WriteLine(date1.ToString("yyyy-MM-ddTHH:mm:sszzz", System.Globalization.CultureInfo.InvariantCulture));
// Displays 2008-03-01T07:00:00+00:00
let date1 = DateTime(2008, 3, 1, 7, 0, 0, DateTimeKind.Utc)
printfn $"""{date1.ToString("yyyy-MM-ddTHH:mm:sszzz", System.Globalization.CultureInfo.InvariantCulture)}"""
// Displays 2008-03-01T07:00:00+00:00
Dim date1 As DateTime = New DateTime(2008, 3, 1, 7, 0, 0, DateTimeKind.Utc)
Console.WriteLine(date1.ToString("yyyy-MM-ddTHH:mm:sszzz", System.Globalization.CultureInfo.InvariantCulture))
' Displays 2008-03-01T07:00:00+00:00
Untuk informasi selengkapnya tentang pemformatan nilai DateTime, lihat String Format Tanggal dan Waktu Standar dan String Format Tanggal dan Waktu Kustom.
Mengurai nilai DateTime dari string
Penguraian mengonversi representasi string tanggal dan waktu menjadi nilai DateTime. Biasanya, string tanggal dan waktu memiliki dua penggunaan yang berbeda dalam aplikasi:
Tanggal dan waktu membutuhkan berbagai bentuk dan mencerminkan konvensi budaya saat ini atau budaya tertentu. Misalnya, aplikasi memungkinkan pengguna yang budayanya saat ini en-US memasukkan nilai tanggal sebagai "15/12/2013" atau "15 Desember 2013". Ini memungkinkan pengguna yang budayanya saat ini en-gb untuk memasukkan nilai tanggal sebagai "15/12/2013" atau "15 Desember 2013."
Tanggal dan waktu diwakili dalam format yang telah ditentukan sebelumnya. Misalnya, aplikasi menserialisasikan tanggal sebagai "20130103" secara independen dari budaya tempat aplikasi berjalan. Aplikasi mungkin memerlukan tanggal diinput dalam format tanggal pendek sesuai budaya saat ini.
Anda menggunakan metode Parse atau TryParse untuk mengonversi string dari salah satu format tanggal dan waktu umum yang digunakan oleh budaya menjadi nilai DateTime. Contoh berikut menunjukkan bagaimana Anda dapat menggunakan TryParse untuk mengonversi string tanggal dalam format khusus budaya yang berbeda menjadi nilai DateTime. Ini mengubah budaya saat ini menjadi Bahasa Inggris (Inggris) dan memanggil metode GetDateTimeFormats() untuk menghasilkan array string tanggal dan waktu. Kemudian meneruskan setiap elemen dalam array ke metode TryParse. Output dari contoh menunjukkan metode penguraian dapat berhasil mengonversi masing-masing string tanggal dan waktu khusus budaya.
System.Threading.Thread.CurrentThread.CurrentCulture =
System.Globalization.CultureInfo.CreateSpecificCulture("en-GB");
var date1 = new DateTime(2013, 6, 1, 12, 32, 30);
var badFormats = new List<String>();
Console.WriteLine($"{"Date String",-37} {"Date",-19}\n");
foreach (var dateString in date1.GetDateTimeFormats())
{
DateTime parsedDate;
if (DateTime.TryParse(dateString, out parsedDate))
Console.WriteLine($"{dateString,-37} {DateTime.Parse(dateString),-19}");
else
badFormats.Add(dateString);
}
// Display strings that could not be parsed.
if (badFormats.Count > 0)
{
Console.WriteLine("\nStrings that could not be parsed: ");
foreach (var badFormat in badFormats)
Console.WriteLine($" {badFormat}");
}
// Press "Run" to see the output.
System.Threading.Thread.CurrentThread.CurrentCulture <-
System.Globalization.CultureInfo.CreateSpecificCulture "en-GB"
let date1 = DateTime(2013, 6, 1, 12, 32, 30)
let badFormats = ResizeArray<String>()
printfn "%-37s %-19s\n" "Date String" "Date"
for dateString in date1.GetDateTimeFormats() do
match DateTime.TryParse dateString with
| true, parsedDate ->
printfn $"%-37s{dateString} %-19O{parsedDate}\n"
| _ ->
badFormats.Add dateString
// Display strings that could not be parsed.
if badFormats.Count > 0 then
printfn "\nStrings that could not be parsed: "
for badFormat in badFormats do
printfn $" {badFormat}"
// Press "Run" to see the output.
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-GB")
Dim date1 As New DateTime(2013, 6, 1, 12, 32, 30)
Dim badFormats As New List(Of String)
Console.WriteLine($"{"Date String",-37} {"Date",-19}")
Console.WriteLine()
For Each dateString As String In date1.GetDateTimeFormats()
Dim parsedDate As DateTime
If DateTime.TryParse(dateString, parsedDate) Then
Console.WriteLine($"{dateString,-37} {DateTime.Parse(dateString),-19:g}")
Else
badFormats.Add(dateString)
End If
Next
' Display strings that could not be parsed.
If badFormats.Count > 0 Then
Console.WriteLine()
Console.WriteLine("Strings that could not be parsed: ")
For Each badFormat In badFormats
Console.WriteLine($" {badFormat}")
Next
End If
' The example displays the following output:
' Date String Date
'
' 01/06/2013 01/06/2013 00:00:00
' 01/06/13 01/06/2013 00:00:00
' 1/6/13 01/06/2013 00:00:00
' 1.6.13 01/06/2013 00:00:00
' 2013-06-01 01/06/2013 00:00:00
' 01 June 2013 01/06/2013 00:00:00
' 1 June 2013 01/06/2013 00:00:00
' 01 June 2013 12:32 01/06/2013 12:32:00
' 01 June 2013 12:32 01/06/2013 12:32:00
' 01 June 2013 12:32 PM 01/06/2013 12:32:00
' 01 June 2013 12:32 PM 01/06/2013 12:32:00
' 1 June 2013 12:32 01/06/2013 12:32:00
' 1 June 2013 12:32 01/06/2013 12:32:00
' 1 June 2013 12:32 PM 01/06/2013 12:32:00
' 1 June 2013 12:32 PM 01/06/2013 12:32:00
' 01 June 2013 12:32:30 01/06/2013 12:32:30
' 01 June 2013 12:32:30 01/06/2013 12:32:30
' 01 June 2013 12:32:30 PM 01/06/2013 12:32:30
' 01 June 2013 12:32:30 PM 01/06/2013 12:32:30
' 1 June 2013 12:32:30 01/06/2013 12:32:30
' 1 June 2013 12:32:30 01/06/2013 12:32:30
' 1 June 2013 12:32:30 PM 01/06/2013 12:32:30
' 1 June 2013 12:32:30 PM 01/06/2013 12:32:30
' 01/06/2013 12:32 01/06/2013 12:32:00
' 01/06/2013 12:32 01/06/2013 12:32:00
' 01/06/2013 12:32 PM 01/06/2013 12:32:00
' 01/06/2013 12:32 PM 01/06/2013 12:32:00
' 01/06/13 12:32 01/06/2013 12:32:00
' 01/06/13 12:32 01/06/2013 12:32:00
' 01/06/13 12:32 PM 01/06/2013 12:32:00
' 01/06/13 12:32 PM 01/06/2013 12:32:00
' 1/6/13 12:32 01/06/2013 12:32:00
' 1/6/13 12:32 01/06/2013 12:32:00
' 1/6/13 12:32 PM 01/06/2013 12:32:00
' 1/6/13 12:32 PM 01/06/2013 12:32:00
' 1.6.13 12:32 01/06/2013 12:32:00
' 1.6.13 12:32 01/06/2013 12:32:00
' 1.6.13 12:32 PM 01/06/2013 12:32:00
' 1.6.13 12:32 PM 01/06/2013 12:32:00
' 2013-06-01 12:32 01/06/2013 12:32:00
' 2013-06-01 12:32 01/06/2013 12:32:00
' 2013-06-01 12:32 PM 01/06/2013 12:32:00
' 2013-06-01 12:32 PM 01/06/2013 12:32:00
' 01/06/2013 12:32:30 01/06/2013 12:32:30
' 01/06/2013 12:32:30 01/06/2013 12:32:30
' 01/06/2013 12:32:30 PM 01/06/2013 12:32:30
' 01/06/2013 12:32:30 PM 01/06/2013 12:32:30
' 01/06/13 12:32:30 01/06/2013 12:32:30
' 01/06/13 12:32:30 01/06/2013 12:32:30
' 01/06/13 12:32:30 PM 01/06/2013 12:32:30
' 01/06/13 12:32:30 PM 01/06/2013 12:32:30
' 1/6/13 12:32:30 01/06/2013 12:32:30
' 1/6/13 12:32:30 01/06/2013 12:32:30
' 1/6/13 12:32:30 PM 01/06/2013 12:32:30
' 1/6/13 12:32:30 PM 01/06/2013 12:32:30
' 1.6.13 12:32:30 01/06/2013 12:32:30
' 1.6.13 12:32:30 01/06/2013 12:32:30
' 1.6.13 12:32:30 PM 01/06/2013 12:32:30
' 1.6.13 12:32:30 PM 01/06/2013 12:32:30
' 2013-06-01 12:32:30 01/06/2013 12:32:30
' 2013-06-01 12:32:30 01/06/2013 12:32:30
' 2013-06-01 12:32:30 PM 01/06/2013 12:32:30
' 2013-06-01 12:32:30 PM 01/06/2013 12:32:30
' 01 June 01/06/2013 00:00:00
' 01 June 01/06/2013 00:00:00
' 2013-06-01T12:32:30.0000000 01/06/2013 12:32:30
' 2013-06-01T12:32:30.0000000 01/06/2013 12:32:30
' Sat, 01 Jun 2013 12:32:30 GMT 01/06/2013 05:32:30
' Sat, 01 Jun 2013 12:32:30 GMT 01/06/2013 05:32:30
' 2013-06-01T12:32:30 01/06/2013 12:32:30
' 12:32 22/04/2013 12:32:00
' 12:32 22/04/2013 12:32:00
' 12:32 PM 22/04/2013 12:32:00
' 12:32 PM 22/04/2013 12:32:00
' 12:32:30 22/04/2013 12:32:30
' 12:32:30 22/04/2013 12:32:30
' 12:32:30 PM 22/04/2013 12:32:30
' 12:32:30 PM 22/04/2013 12:32:30
' 2013-06-01 12:32:30Z 01/06/2013 05:32:30
' 01 June 2013 19:32:30 01/06/2013 19:32:30
' 01 June 2013 19:32:30 01/06/2013 19:32:30
' 01 June 2013 07:32:30 PM 01/06/2013 19:32:30
' 01 June 2013 7:32:30 PM 01/06/2013 19:32:30
' 1 June 2013 19:32:30 01/06/2013 19:32:30
' 1 June 2013 19:32:30 01/06/2013 19:32:30
' 1 June 2013 07:32:30 PM 01/06/2013 19:32:30
' 1 June 2013 7:32:30 PM 01/06/2013 19:32:30
' June 2013 01/06/2013 00:00:00
' June 2013 01/06/2013 00:00:00
Anda menggunakan metode ParseExact dan TryParseExact untuk mengonversi string yang harus cocok dengan format atau format tertentu dengan nilai DateTime. Anda menentukan satu atau beberapa string format tanggal dan waktu sebagai parameter ke metode penguraian. Contoh berikut menggunakan metode TryParseExact(String, String[], IFormatProvider, DateTimeStyles, DateTime) untuk mengonversi string yang harus dalam format "yyyyMMdd" atau format "HHmmss" ke nilai DateTime.
string[] formats = { "yyyyMMdd", "HHmmss" };
string[] dateStrings = { "20130816", "20131608", " 20130816 ",
"115216", "521116", " 115216 " };
DateTime parsedDate;
foreach (var dateString in dateStrings)
{
if (DateTime.TryParseExact(dateString, formats, null,
System.Globalization.DateTimeStyles.AllowWhiteSpaces |
System.Globalization.DateTimeStyles.AdjustToUniversal,
out parsedDate))
Console.WriteLine($"{dateString} --> {parsedDate:g}");
else
Console.WriteLine($"Cannot convert {dateString}");
}
// The example displays the following output:
// 20130816 --> 8/16/2013 12:00 AM
// Cannot convert 20131608
// 20130816 --> 8/16/2013 12:00 AM
// 115216 --> 4/22/2013 11:52 AM
// Cannot convert 521116
// 115216 --> 4/22/2013 11:52 AM
let formats = [| "yyyyMMdd"; "HHmmss" |]
let dateStrings =
[ "20130816"; "20131608"; " 20130816 "
"115216"; "521116"; " 115216 " ]
for dateString in dateStrings do
match DateTime.TryParseExact(dateString, formats, null,
System.Globalization.DateTimeStyles.AllowWhiteSpaces |||
System.Globalization.DateTimeStyles.AdjustToUniversal) with
| true, parsedDate ->
printfn $"{dateString} --> {parsedDate:g}"
| _ ->
printfn $"Cannot convert {dateString}"
// The example displays the following output:
// 20130816 --> 8/16/2013 12:00 AM
// Cannot convert 20131608
// 20130816 --> 8/16/2013 12:00 AM
// 115216 --> 4/22/2013 11:52 AM
// Cannot convert 521116
// 115216 --> 4/22/2013 11:52 AM
Dim formats() As String = {"yyyyMMdd", "HHmmss"}
Dim dateStrings() As String = {"20130816", "20131608",
" 20130816 ", "115216",
"521116", " 115216 "}
Dim parsedDate As DateTime
For Each dateString As String In dateStrings
If DateTime.TryParseExact(dateString, formats, Nothing,
DateTimeStyles.AllowWhiteSpaces Or
DateTimeStyles.AdjustToUniversal,
parsedDate) Then
Console.WriteLine($"{dateString} --> {parsedDate:g}")
Else
Console.WriteLine($"Cannot convert {dateString}")
End If
Next
' The example displays the following output:
' 20130816 --> 8/16/2013 12:00 AM
' Cannot convert 20131608
' 20130816 --> 8/16/2013 12:00 AM
' 115216 --> 4/22/2013 11:52 AM
' Cannot convert 521116
' 115216 --> 4/22/2013 11:52 AM
Salah satu penggunaan umum untuk ParseExact adalah mengonversi representasi string dari layanan web, biasanya dalam format standar ISO 8601. Kode berikut menunjukkan string format yang benar untuk digunakan:
var iso8601String = "20080501T08:30:52Z";
DateTime dateISO8602 = DateTime.ParseExact(iso8601String, "yyyyMMddTHH:mm:ssZ",
System.Globalization.CultureInfo.InvariantCulture);
Console.WriteLine($"{iso8601String} --> {dateISO8602:g}");
let iso8601String = "20080501T08:30:52Z"
let dateISO8602 = DateTime.ParseExact(iso8601String, "yyyyMMddTHH:mm:ssZ", System.Globalization.CultureInfo.InvariantCulture)
printfn $"{iso8601String} --> {dateISO8602:g}"
Dim iso8601String As String = "20080501T08:30:52Z"
Dim dateISO8602 As DateTime = DateTime.ParseExact(iso8601String, "yyyyMMddTHH:mm:ssZ", CultureInfo.InvariantCulture)
Console.WriteLine($"{iso8601String} --> {dateISO8602:g}")
Jika string tidak dapat diurai, metode Parse dan ParseExact melemparkan pengecualian. Metode TryParse dan TryParseExact mengembalikan nilai Boolean yang menunjukkan apakah konversi berhasil atau gagal. Anda harus menggunakan metode TryParse atau TryParseExact dalam skenario di mana performa penting. Operasi penguraian untuk string tanggal dan waktu cenderung memiliki tingkat kegagalan yang tinggi, dan penanganan pengecualian mahal. Gunakan metode ini jika string diinput oleh pengguna atau berasal dari sumber yang tidak diketahui.
Untuk informasi selengkapnya tentang mengurai nilai tanggal dan waktu, lihat Mengurai String Tanggal dan Waktu.
Nilai WaktuTanggal
Deskripsi nilai waktu dalam jenis DateTime sering dinyatakan menggunakan standar Waktu Universal Terkoordinasi (UTC). Waktu Universal Terkoordinasi adalah nama yang diakui secara internasional untuk Greenwich Mean Time (GMT). Waktu Universal Terkoordinasi adalah waktu sebagaimana diukur pada garis bujur nol derajat, titik asal UTC. Waktu musim panas tidak berlaku untuk UTC.
Waktu lokal relatif terhadap zona waktu tertentu. Zona waktu dikaitkan dengan selisih waktu zona waktu. Offset zona waktu adalah selisih zona waktu yang diukur dalam jam dari titik asal UTC. Selain itu, waktu lokal secara opsional dipengaruhi oleh waktu hemat siang, yang menambahkan atau mengurangi penyesuaian interval waktu. Waktu lokal dihitung dengan menambahkan offset zona waktu ke UTC dan menyesuaikan untuk waktu musim panas jika perlu. Offset zona waktu pada titik asal UTC adalah nol.
Waktu UTC cocok untuk perhitungan, perbandingan, dan penyimpanan tanggal dan waktu dalam file. Waktu lokal sesuai untuk ditampilkan di antarmuka pengguna aplikasi desktop. Aplikasi yang sadar zona waktu (seperti banyak aplikasi Web) juga perlu bekerja dengan sejumlah zona waktu lainnya.
Jika properti Kind dari objek DateTime adalah DateTimeKind.Unspecified, tidak ditentukan apakah waktu yang diwakilinya adalah waktu lokal, waktu UTC, atau waktu di zona waktu lain.
Resolusi Waktu dan Tanggal
Nota
Sebagai alternatif untuk melakukan aritmatika tanggal dan waktu pada nilai DateTime untuk mengukur waktu yang berlalu, Anda dapat menggunakan kelas Stopwatch.
Properti Ticks mengekspresikan nilai tanggal dan waktu dalam satuan sepuluh juta detik. Properti Millisecond mengembalikan seperseribu detik dari nilai tanggal dan waktu. Menggunakan panggilan berulang ke properti DateTime.Now untuk mengukur waktu yang berlalu tergantung pada jam sistem. Jam sistem pada sistem Windows 7 dan Windows 8 memiliki resolusi sekitar 15 milidetik. Resolusi ini memengaruhi interval waktu kecil kurang dari 100 milidetik.
Contoh berikut mengilustrasikan ketergantungan nilai tanggal dan waktu saat ini pada resolusi jam sistem. Dalam contoh, perulangan luar diulang 20 kali, dan perulangan dalam berfungsi untuk menunda perulangan luar. Jika nilai penghitung perulangan luar adalah 10, panggilan ke metode Thread.Sleep memperkenalkan penundaan lima milidetik. Contoh berikut menunjukkan jumlah milidetik yang dikembalikan oleh properti DateTime.Now.Milliseconds berubah hanya setelah panggilan ke Thread.Sleep.
string output = "";
for (int ctr = 0; ctr <= 20; ctr++)
{
output += String.Format($"{DateTime.Now.Millisecond}\n");
// Introduce a delay loop.
for (int delay = 0; delay <= 1000; delay++)
{ }
if (ctr == 10)
{
output += "Thread.Sleep called...\n";
System.Threading.Thread.Sleep(5);
}
}
Console.WriteLine(output);
// Press "Run" to see the output.
let mutable output = ""
for i = 0 to 20 do
output <- output + $"{DateTime.Now.Millisecond}\n"
// Introduce a delay loop.
for _ = 0 to 1000 do ()
if i = 10 then
output <- output + "Thread.Sleep called...\n"
System.Threading.Thread.Sleep 5
printfn $"{output}"
// Press "Run" to see the output.
Dim output As String = ""
For ctr As Integer = 0 To 20
output += Date.Now.Millisecond.ToString() + vbCrLf
' Introduce a delay loop.
For delay As Integer = 0 To 1000
Next
If ctr = 10 Then
output += "Thread.Sleep called..." + vbCrLf
Thread.Sleep(5)
End If
Next
Console.WriteLine(output)
' The example displays output like the following:
' 111
' 111
' 111
' 111
' 111
' 111
' 111
' 111
' 111
' 111
' 111
' Thread.Sleep called...
' 143
' 143
' 143
' 143
' 143
' 143
' 143
' 143
' 143
' 143
Operasi DateTime
Perhitungan menggunakan struktur DateTime, seperti Add atau Subtract, tidak mengubah nilai struktur. Sebaliknya, perhitungan mengembalikan struktur DateTime baru yang nilainya adalah hasil perhitungan.
Operasi konversi antara zona waktu (seperti antara UTC dan waktu lokal, atau antara satu zona waktu dan zona waktu lainnya) memperhitungkan waktu musim panas, tetapi operasi aritmatika dan perbandingan tidak.
Struktur DateTime itu sendiri menawarkan dukungan terbatas untuk mengonversi dari satu zona waktu ke zona waktu lainnya. Anda dapat menggunakan metode ToLocalTime untuk mengonversi UTC ke waktu lokal, atau Anda dapat menggunakan metode ToUniversalTime untuk mengonversi dari waktu lokal ke UTC. Namun, serangkaian metode konversi zona waktu lengkap tersedia di kelas TimeZoneInfo. Anda mengonversi waktu di salah satu zona waktu dunia ke waktu di zona waktu lain menggunakan metode ini.
Perhitungan dan perbandingan objek DateTime bermakna hanya jika objek mewakili waktu dalam zona waktu yang sama. Anda dapat menggunakan objek TimeZoneInfo untuk mewakili zona waktu nilai DateTime, meskipun keduanya digabungkan secara longgar. Objek DateTime tidak memiliki properti yang mengembalikan objek yang mewakili zona waktu nilai tanggal dan waktu tersebut. Properti Kind menunjukkan apakah DateTime mewakili UTC, waktu lokal, atau tidak ditentukan. Dalam aplikasi sadar zona waktu, Anda harus mengandalkan beberapa mekanisme eksternal untuk menentukan zona waktu tempat objek DateTime dibuat. Anda dapat menggunakan struktur yang membungkus nilai DateTime dan objek TimeZoneInfo yang mewakili zona waktu nilai DateTime. Untuk detail tentang menggunakan UTC dalam perhitungan dan perbandingan dengan nilai DateTime, lihat Melakukan Operasi Aritmatika dengan Tanggal dan Waktu.
Setiap anggota DateTime secara implisit menggunakan kalender Gregorian untuk melakukan operasinya. Pengecualian adalah metode yang secara implisit menentukan kalender. Ini termasuk konstruktor yang menentukan kalender, dan metode dengan parameter yang berasal dari IFormatProvider, seperti System.Globalization.DateTimeFormatInfo.
Operasi oleh anggota jenis DateTime memperhitungkan detail seperti tahun kabisat dan jumlah hari dalam sebulan.
Nilai DateTime dan kalender
Pustaka Kelas .NET mencakup sejumlah kelas kalender, yang semuanya berasal dari kelas Calendar. Mereka adalah:
- Kelas ChineseLunisolarCalendar.
- Kelas EastAsianLunisolarCalendar.
- Kelas GregorianCalendar.
- Kelas HebrewCalendar.
- Kelas HijriCalendar.
- Kelas JapaneseCalendar.
- Kelas JapaneseLunisolarCalendar.
- Kelas JulianCalendar.
- Kelas KoreanCalendar.
- Kelas KoreanLunisolarCalendar.
- Kelas PersianCalendar.
- Kelas TaiwanCalendar.
- Kelas TaiwanLunisolarCalendar.
- Kelas ThaiBuddhistCalendar.
- Kelas UmAlQuraCalendar.
Penting
Era dalam kalender Jepang didasarkan pada pemerintahan kaisar dan oleh karena itu diharapkan untuk berubah. Misalnya, 1 Mei 2019 menandai awal era Reiwa di JapaneseCalendar dan JapaneseLunisolarCalendar. Perubahan era seperti itu memengaruhi semua aplikasi yang menggunakan kalender ini. Untuk informasi selengkapnya dan untuk menentukan apakah aplikasi Anda terpengaruh, lihat Menangani era baru di kalender Jepang di .NET. Untuk informasi tentang menguji aplikasi Anda pada sistem Windows untuk memastikan kesiapan mereka untuk perubahan era, lihat Menyiapkan aplikasi Anda untuk perubahan era Jepang. Untuk fitur di .NET yang mendukung kalender dengan beberapa era dan untuk praktik terbaik saat bekerja dengan kalender yang mendukung beberapa era, lihat Bekerja dengan era.
Setiap budaya menggunakan kalender default yang ditentukan oleh properti CultureInfo.Calendar baca-saja. Setiap budaya mungkin mendukung satu atau beberapa kalender yang ditentukan oleh properti CultureInfo.OptionalCalendars hanya-baca. Kalender yang saat ini digunakan oleh objek CultureInfo tertentu ditentukan oleh properti DateTimeFormatInfo.Calendar. Ini harus menjadi salah satu kalender yang ditemukan dalam array CultureInfo.OptionalCalendars.
Kalender budaya saat ini digunakan dalam semua operasi pemformatan untuk budaya tersebut. Misalnya, kalender default budaya Buddha Thailand adalah kalender Era Buddha Thailand, yang diwakili oleh kelas ThaiBuddhistCalendar. Ketika objek CultureInfo yang mewakili budaya Buddha Thailand digunakan dalam operasi pemformatan tanggal dan waktu, kalender Era Buddha Thailand digunakan secara default. Kalender Gregorian hanya digunakan jika properti DateTimeFormatInfo.Calendar budaya diubah, seperti yang ditunjukkan contoh berikut:
var thTH = new System.Globalization.CultureInfo("th-TH");
var value = new DateTime(2016, 5, 28);
Console.WriteLine(value.ToString(thTH));
thTH.DateTimeFormat.Calendar = new System.Globalization.GregorianCalendar();
Console.WriteLine(value.ToString(thTH));
// The example displays the following output:
// 28/5/2559 0:00:00
// 28/5/2016 0:00:00
let thTH = System.Globalization.CultureInfo "th-TH"
let value = DateTime(2016, 5, 28)
printfn $"{value.ToString thTH}"
thTH.DateTimeFormat.Calendar <- System.Globalization.GregorianCalendar()
printfn $"{value.ToString thTH}"
// The example displays the following output:
// 28/5/2559 0:00:00
// 28/5/2016 0:00:00
Dim thTH As New CultureInfo("th-TH")
Dim value As New DateTime(2016, 5, 28)
Console.WriteLine(value.ToString(thTH))
thTH.DateTimeFormat.Calendar = New GregorianCalendar()
Console.WriteLine(value.ToString(thTH))
' The example displays the following output:
' 28/5/2559 0:00:00
' 28/5/2016 0:00:00
Kalender budaya saat ini juga digunakan dalam semua operasi penguraian untuk budaya tersebut, seperti yang ditunjukkan contoh berikut.
var thTH = new System.Globalization.CultureInfo("th-TH");
var value = DateTime.Parse("28/05/2559", thTH);
Console.WriteLine(value.ToString(thTH));
thTH.DateTimeFormat.Calendar = new System.Globalization.GregorianCalendar();
Console.WriteLine(value.ToString(thTH));
// The example displays the following output:
// 28/5/2559 0:00:00
// 28/5/2016 0:00:00
let thTH = System.Globalization.CultureInfo "th-TH"
let value = DateTime.Parse("28/05/2559", thTH)
printfn $"{value.ToString thTH}"
thTH.DateTimeFormat.Calendar <- System.Globalization.GregorianCalendar()
printfn $"{value.ToString thTH}"
// The example displays the following output:
// 28/5/2559 0:00:00
// 28/5/2016 0:00:00
Private Sub ThaiBuddhistEraParse()
Dim thTH As New CultureInfo("th-TH")
Dim value As DateTime = DateTime.Parse("28/5/2559", thTH)
Console.WriteLine(value.ToString(thTH))
thTH.DateTimeFormat.Calendar = New GregorianCalendar()
Console.WriteLine(value.ToString(thTH))
' The example displays the following output:
' 28/5/2559 0:00:00
' 28/5/2016 0:00:00
End Sub
Anda membuat instans nilai DateTime menggunakan elemen tanggal dan waktu (jumlah tahun, bulan, dan hari) kalender tertentu dengan memanggil konstruktor DateTime yang menyertakan parameter calendar dan meneruskannya objek Calendar yang mewakili kalender tersebut. Contoh berikut menggunakan elemen tanggal dan waktu dari kalender ThaiBuddhistCalendar.
var thTH = new System.Globalization.CultureInfo("th-TH");
var dat = new DateTime(2559, 5, 28, thTH.DateTimeFormat.Calendar);
Console.WriteLine($"Thai Buddhist era date: {dat.ToString("d", thTH)}");
Console.WriteLine($"Gregorian date: {dat:d}");
// The example displays the following output:
// Thai Buddhist Era Date: 28/5/2559
// Gregorian Date: 28/05/2016
let thTH = System.Globalization.CultureInfo "th-TH"
let dat = DateTime(2559, 5, 28, thTH.DateTimeFormat.Calendar)
printfn $"""Thai Buddhist era date: {dat.ToString("d", thTH)}"""
printfn $"Gregorian date: {dat:d}"
// The example displays the following output:
// Thai Buddhist Era Date: 28/5/2559
// Gregorian Date: 28/05/2016
Dim thTH As New CultureInfo("th-TH")
Dim dat As New DateTime(2559, 5, 28, thTH.DateTimeFormat.Calendar)
Console.WriteLine($"Thai Buddhist Era date: {dat.ToString("d", thTH)}")
Console.WriteLine($"Gregorian date: {dat:d}")
' The example displays the following output:
' Thai Buddhist Era Date: 28/5/2559
' Gregorian Date: 28/05/2016
DateTime konstruktor yang tidak menyertakan parameter calendar mengasumsikan bahwa elemen tanggal dan waktu dinyatakan sebagai unit dalam kalender Gregorian.
Semua properti dan metode DateTime lainnya menggunakan kalender Gregorian. Misalnya, properti DateTime.Year mengembalikan tahun dalam kalender Gregorian, dan metode DateTime.IsLeapYear(Int32) mengasumsikan bahwa parameter year adalah tahun dalam kalender Gregorian. Setiap anggota DateTime yang menggunakan kalender Gregorian memiliki anggota kelas Calendar yang sesuai yang menggunakan kalender tertentu. Misalnya, metode Calendar.GetYear mengembalikan tahun dalam kalender tertentu, dan metode Calendar.IsLeapYear menginterpretasikan parameter year sebagai angka tahun dalam kalender tertentu. Contoh berikut menggunakan DateTime dan komponen dari kelas ThaiBuddhistCalendar yang sesuai.
var thTH = new System.Globalization.CultureInfo("th-TH");
var cal = thTH.DateTimeFormat.Calendar;
var dat = new DateTime(2559, 5, 28, cal);
Console.WriteLine("Using the Thai Buddhist Era calendar:");
Console.WriteLine($"Date: {dat.ToString("d", thTH)}");
Console.WriteLine($"Year: {cal.GetYear(dat)}");
Console.WriteLine($"Leap year: {cal.IsLeapYear(cal.GetYear(dat))}\n");
Console.WriteLine("Using the Gregorian calendar:");
Console.WriteLine($"Date: {dat:d}");
Console.WriteLine($"Year: {dat.Year}");
Console.WriteLine($"Leap year: {DateTime.IsLeapYear(dat.Year)}");
// The example displays the following output:
// Using the Thai Buddhist Era calendar
// Date : 28/5/2559
// Year: 2559
// Leap year : True
//
// Using the Gregorian calendar
// Date : 28/05/2016
// Year: 2016
// Leap year : True
let thTH = System.Globalization.CultureInfo "th-TH"
let cal = thTH.DateTimeFormat.Calendar
let dat = DateTime(2559, 5, 28, cal)
printfn "Using the Thai Buddhist Era calendar:"
printfn $"""Date: {dat.ToString("d", thTH)}"""
printfn $"Year: {cal.GetYear dat}"
printfn $"Leap year: {cal.IsLeapYear(cal.GetYear dat)}\n"
printfn "Using the Gregorian calendar:"
printfn $"Date: {dat:d}"
printfn $"Year: {dat.Year}"
printfn $"Leap year: {DateTime.IsLeapYear dat.Year}"
// The example displays the following output:
// Using the Thai Buddhist Era calendar
// Date : 28/5/2559
// Year: 2559
// Leap year : True
//
// Using the Gregorian calendar
// Date : 28/05/2016
// Year: 2016
// Leap year : True
Dim thTH As New CultureInfo("th-TH")
Dim cal As Calendar = thTH.DateTimeFormat.Calendar
Dim dat As New DateTime(2559, 5, 28, cal)
Console.WriteLine("Using the Thai Buddhist Era calendar:")
Console.WriteLine($"Date: {dat.ToString("d", thTH)}")
Console.WriteLine($"Year: {cal.GetYear(dat)}")
Console.WriteLine($"Leap year: {cal.IsLeapYear(cal.GetYear(dat))}")
Console.WriteLine()
Console.WriteLine("Using the Gregorian calendar:")
Console.WriteLine($"Date: {dat:d}")
Console.WriteLine($"Year: {dat.Year}")
Console.WriteLine($"Leap year: {DateTime.IsLeapYear(dat.Year)}")
' The example displays the following output:
' Using the Thai Buddhist Era calendar
' Date : 28/5/2559
' Year: 2559
' Leap year : True
'
' Using the Gregorian calendar
' Date : 28/05/2016
' Year: 2016
' Leap year : True
Struktur DateTime mencakup properti DayOfWeek yang mengembalikan hari dalam seminggu di kalender Gregorian. Ini tidak termasuk anggota yang memungkinkan Anda untuk mendapatkan nomor minggu dalam tahun. Untuk mendapatkan minggu dalam tahun, panggil metode Calendar.GetWeekOfYear dari kalender individual. Contoh berikut memberikan ilustrasi.
var thTH = new System.Globalization.CultureInfo("th-TH");
var thCalendar = thTH.DateTimeFormat.Calendar;
var dat = new DateTime(1395, 8, 18, thCalendar);
Console.WriteLine("Using the Thai Buddhist Era calendar:");
Console.WriteLine($"Date: {dat.ToString("d", thTH)}");
Console.WriteLine($"Day of Week: {thCalendar.GetDayOfWeek(dat)}");
Console.WriteLine($"Week of year: {thCalendar.GetWeekOfYear(dat, System.Globalization.CalendarWeekRule.FirstDay, DayOfWeek.Sunday)}\n");
var greg = new System.Globalization.GregorianCalendar();
Console.WriteLine("Using the Gregorian calendar:");
Console.WriteLine($"Date: {dat:d}");
Console.WriteLine($"Day of Week: {dat.DayOfWeek}");
Console.WriteLine($"Week of year: {greg.GetWeekOfYear(dat, System.Globalization.CalendarWeekRule.FirstDay,DayOfWeek.Sunday)}");
// The example displays the following output:
// Using the Thai Buddhist Era calendar
// Date : 18/8/1395
// Day of Week: Sunday
// Week of year: 34
//
// Using the Gregorian calendar
// Date : 18/08/0852
// Day of Week: Sunday
// Week of year: 34
let thTH = System.Globalization.CultureInfo "th-TH"
let thCalendar = thTH.DateTimeFormat.Calendar
let dat = DateTime(1395, 8, 18, thCalendar)
printfn "Using the Thai Buddhist Era calendar:"
printfn $"""Date: {dat.ToString("d", thTH)}"""
printfn $"Day of Week: {thCalendar.GetDayOfWeek dat}"
printfn $"Week of year: {thCalendar.GetWeekOfYear(dat, System.Globalization.CalendarWeekRule.FirstDay, DayOfWeek.Sunday)}\n"
let greg = System.Globalization.GregorianCalendar()
printfn "Using the Gregorian calendar:"
printfn $"Date: {dat:d}"
printfn $"Day of Week: {dat.DayOfWeek}"
printfn $"Week of year: {greg.GetWeekOfYear(dat, System.Globalization.CalendarWeekRule.FirstDay, DayOfWeek.Sunday)}"
// The example displays the following output:
// Using the Thai Buddhist Era calendar
// Date : 18/8/1395
// Day of Week: Sunday
// Week of year: 34
//
// Using the Gregorian calendar
// Date : 18/08/0852
// Day of Week: Sunday
// Week of year: 34
Dim thTH As New CultureInfo("th-TH")
Dim thCalendar As Calendar = thTH.DateTimeFormat.Calendar
Dim dat As New DateTime(1395, 8, 18, thCalendar)
Console.WriteLine("Using the Thai Buddhist Era calendar:")
Console.WriteLine($"Date: {dat.ToString("d", thTH)}")
Console.WriteLine($"Day of Week: {thCalendar.GetDayOfWeek(dat)}")
Console.WriteLine($"Week of year: {thCalendar.GetWeekOfYear(dat, CalendarWeekRule.FirstDay, DayOfWeek.Sunday)}")
Console.WriteLine()
Dim greg As Calendar = New GregorianCalendar()
Console.WriteLine("Using the Gregorian calendar:")
Console.WriteLine($"Date: {dat:d}")
Console.WriteLine($"Day of Week: {dat.DayOfWeek}")
Console.WriteLine($"Week of year: {greg.GetWeekOfYear(dat, CalendarWeekRule.FirstDay, DayOfWeek.Sunday)}")
' The example displays the following output:
' Using the Thai Buddhist Era calendar
' Date : 18/8/1395
' Day of Week: Sunday
' Week of year: 34
'
' Using the Gregorian calendar
' Date : 18/08/0852
' Day of Week: Sunday
' Week of year: 34
Untuk informasi selengkapnya tentang tanggal dan kalender, lihat Bekerja dengan Kalender.
Pertahankan nilai DateTime
Anda dapat mempertahankan nilai DateTime dengan cara berikut:
- Konversikan mereka menjadi string dan simpan string tersebut.
- Mengonversinya menjadi nilai bilangan bulat 64-bit (nilai properti Ticks) dan mempertahankan bilangan bulat.
- Serialisasi nilai DateTime.
Anda harus memastikan bahwa rutinitas yang memulihkan nilai DateTime tidak kehilangan data atau melemparkan pengecualian terlepas dari teknik mana yang Anda pilih. DateTime nilai harus dapat kembali ke bentuk semula. Artinya, nilai asli dan nilai yang dipulihkan harus sama. Dan jika nilai DateTime asli mewakili satu instans waktu, nilai tersebut harus mengidentifikasi momen waktu yang sama saat dipulihkan.
Menyimpan nilai-nilai sebagai string
Agar berhasil memulihkan nilai DateTime yang dipertahankan sebagai string, ikuti aturan berikut:
Buat asumsi yang sama tentang pemformatan khusus budaya saat Anda mengembalikan string seperti saat Anda menyimpannya. Untuk memastikan bahwa sebuah string dapat dipulihkan pada sistem yang budayanya saat ini berbeda dari budaya sistem tempat string tersebut disimpan, gunakan overload ToString untuk menyimpan string tersebut dengan menggunakan konvensi budaya invarian. Panggil Parse(String, IFormatProvider, DateTimeStyles) atau TryParse(String, IFormatProvider, DateTimeStyles, DateTime) kelebihan beban untuk memulihkan string dengan menggunakan konvensi budaya yang invarian. Jangan pernah menggunakan overload ToString(), Parse(String), atau TryParse(String, DateTime), yang mengikuti konvensi budaya saat ini.
Jika tanggal menunjukkan satu momen waktu, pastikan tanggal mewakili momen yang sama pada saat dipulihkan, bahkan pada zona waktu yang berbeda. Konversikan nilai DateTime menjadi Waktu Universal Terkoordinasi (UTC) sebelum menyimpannya atau menggunakan DateTimeOffset.
Kesalahan paling umum yang dibuat saat mempertahankan nilai DateTime sebagai string adalah mengandalkan konvensi pemformatan dari budaya default atau saat ini. Masalah muncul jika budaya saat ini berbeda saat menyimpan dan memulihkan string. Contoh berikut mengilustrasikan masalah ini. Ini menyimpan lima tanggal menggunakan konvensi pemformatan budaya saat ini, yang dalam hal ini adalah Bahasa Inggris (Amerika Serikat). Ini memulihkan tanggal menggunakan konvensi pemformatan dari budaya yang berbeda, yang dalam hal ini adalah Bahasa Inggris (Inggris). Karena konvensi pemformatan dari dua budaya berbeda, dua tanggal tidak dapat dipulihkan, dan tiga tanggal lainnya salah ditafsirkan. Selain itu, jika nilai tanggal dan waktu asli mewakili satu momen tepat waktu, waktu yang dipulihkan salah karena informasi zona waktu hilang.
public static void PersistAsLocalStrings()
{
SaveLocalDatesAsString();
RestoreLocalDatesFromString();
}
private static void SaveLocalDatesAsString()
{
DateTime[] dates = { new DateTime(2014, 6, 14, 6, 32, 0),
new DateTime(2014, 7, 10, 23, 49, 0),
new DateTime(2015, 1, 10, 1, 16, 0),
new DateTime(2014, 12, 20, 21, 45, 0),
new DateTime(2014, 6, 2, 15, 14, 0) };
string? output = null;
Console.WriteLine($"Current Time Zone: {TimeZoneInfo.Local.DisplayName}");
Console.WriteLine($"The dates on an {Thread.CurrentThread.CurrentCulture.Name} system:");
for (int ctr = 0; ctr < dates.Length; ctr++)
{
Console.WriteLine(dates[ctr].ToString("f"));
output += dates[ctr].ToString() + (ctr != dates.Length - 1 ? "|" : "");
}
var sw = new StreamWriter(filenameTxt);
sw.Write(output);
sw.Close();
Console.WriteLine("Saved dates...");
}
private static void RestoreLocalDatesFromString()
{
TimeZoneInfo.ClearCachedData();
Console.WriteLine($"Current Time Zone: {TimeZoneInfo.Local.DisplayName}");
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-GB");
StreamReader sr = new StreamReader(filenameTxt);
string[] inputValues = sr.ReadToEnd().Split(new char[] { '|' },
StringSplitOptions.RemoveEmptyEntries);
sr.Close();
Console.WriteLine($"The dates on an {Thread.CurrentThread.CurrentCulture.Name} system:");
foreach (var inputValue in inputValues)
{
DateTime dateValue;
if (DateTime.TryParse(inputValue, out dateValue))
{
Console.WriteLine($"'{inputValue}' --> {dateValue:f}");
}
else
{
Console.WriteLine($"Cannot parse '{inputValue}'");
}
}
Console.WriteLine("Restored dates...");
}
// When saved on an en-US system, the example displays the following output:
// Current Time Zone: (UTC-08:00) Pacific Time (US & Canada)
// The dates on an en-US system:
// Saturday, June 14, 2014 6:32 AM
// Thursday, July 10, 2014 11:49 PM
// Saturday, January 10, 2015 1:16 AM
// Saturday, December 20, 2014 9:45 PM
// Monday, June 02, 2014 3:14 PM
// Saved dates...
//
// When restored on an en-GB system, the example displays the following output:
// Current Time Zone: (UTC) Dublin, Edinburgh, Lisbon, London
// The dates on an en-GB system:
// Cannot parse //6/14/2014 6:32:00 AM//
// //7/10/2014 11:49:00 PM// --> 07 October 2014 23:49
// //1/10/2015 1:16:00 AM// --> 01 October 2015 01:16
// Cannot parse //12/20/2014 9:45:00 PM//
// //6/2/2014 3:14:00 PM// --> 06 February 2014 15:14
// Restored dates...
let saveLocalDatesAsString () =
let dates =
[ DateTime(2014, 6, 14, 6, 32, 0)
DateTime(2014, 7, 10, 23, 49, 0)
DateTime(2015, 1, 10, 1, 16, 0)
DateTime(2014, 12, 20, 21, 45, 0)
DateTime(2014, 6, 2, 15, 14, 0) ]
printfn $"Current Time Zone: {TimeZoneInfo.Local.DisplayName}"
printfn $"The dates on an {Thread.CurrentThread.CurrentCulture.Name} system:"
let output =
[ for date in dates do
printfn $"{date}"
string date ]
|> String.concat "|"
use sw = new StreamWriter(filenameTxt)
sw.Write output
printfn "Saved dates..."
let restoreLocalDatesFromString () =
TimeZoneInfo.ClearCachedData()
printfn $"Current Time Zone: {TimeZoneInfo.Local.DisplayName}"
Thread.CurrentThread.CurrentCulture <- CultureInfo.CreateSpecificCulture "en-GB"
use sr = new StreamReader(filenameTxt)
let inputValues =
sr.ReadToEnd().Split('|', StringSplitOptions.RemoveEmptyEntries)
printfn $"The dates on an {Thread.CurrentThread.CurrentCulture.Name} system:"
for inputValue in inputValues do
match DateTime.TryParse inputValue with
| true, dateValue ->
printfn $"'{inputValue}' --> {dateValue:f}"
| _ ->
printfn $"Cannot parse '{inputValue}'"
printfn "Restored dates..."
let persistAsLocalStrings () =
saveLocalDatesAsString ()
restoreLocalDatesFromString ()
// When saved on an en-US system, the example displays the following output:
// Current Time Zone: (UTC-08:00) Pacific Time (US & Canada)
// The dates on an en-US system:
// Saturday, June 14, 2014 6:32 AM
// Thursday, July 10, 2014 11:49 PM
// Saturday, January 10, 2015 1:16 AM
// Saturday, December 20, 2014 9:45 PM
// Monday, June 02, 2014 3:14 PM
// Saved dates...
//
// When restored on an en-GB system, the example displays the following output:
// Current Time Zone: (UTC) Dublin, Edinburgh, Lisbon, London
// The dates on an en-GB system:
// Cannot parse //6/14/2014 6:32:00 AM//
// //7/10/2014 11:49:00 PM// --> 07 October 2014 23:49
// //1/10/2015 1:16:00 AM// --> 01 October 2015 01:16
// Cannot parse //12/20/2014 9:45:00 PM//
// //6/2/2014 3:14:00 PM// --> 06 February 2014 15:14
// Restored dates...
Agar nilai DateTime dapat diproses pulang pergi dengan berhasil, ikuti langkah-langkah berikut:
- Jika nilai mewakili satu momen waktu, konversikan dari waktu lokal ke UTC dengan memanggil metode ToUniversalTime.
- Konversikan tanggal ke representasi string mereka dengan memanggil overload ToString(String, IFormatProvider) atau String.Format(IFormatProvider, String, Object[]). Gunakan konvensi pemformatan budaya invarian dengan menentukan CultureInfo.InvariantCulture sebagai argumen
provider. Tentukan bahwa nilai harus pulang pergi dengan menggunakan string format standar "O" atau "R".
Untuk memulihkan nilai DateTime yang dipertahankan tanpa kehilangan data, ikuti langkah-langkah berikut:
- Uraikan data dengan memanggil overload ParseExact atau TryParseExact. Tentukan CultureInfo.InvariantCulture sebagai argumen
provider, dan gunakan string format standar yang sama dengan yang Anda gunakan untuk argumenformatselama konversi. Sertakan nilai DateTimeStyles.RoundtripKind dalam argumenstyles. - Jika nilai DateTime mewakili satu momen tepat waktu, panggil metode ToLocalTime untuk mengonversi tanggal yang diurai dari UTC ke waktu lokal.
Contoh berikut menggunakan budaya invarian dan string format standar "O" untuk memastikan bahwa nilai DateTime disimpan dan dipulihkan mewakili momen yang sama dalam waktu terlepas dari sistem, budaya, atau zona waktu sistem sumber dan target.
public static void PersistAsInvariantStrings()
{
SaveDatesAsInvariantStrings();
RestoreDatesAsInvariantStrings();
}
private static void SaveDatesAsInvariantStrings()
{
DateTime[] dates = { new DateTime(2014, 6, 14, 6, 32, 0),
new DateTime(2014, 7, 10, 23, 49, 0),
new DateTime(2015, 1, 10, 1, 16, 0),
new DateTime(2014, 12, 20, 21, 45, 0),
new DateTime(2014, 6, 2, 15, 14, 0) };
string? output = null;
Console.WriteLine($"Current Time Zone: {TimeZoneInfo.Local.DisplayName}");
Console.WriteLine($"The dates on an {Thread.CurrentThread.CurrentCulture.Name} system:");
for (int ctr = 0; ctr < dates.Length; ctr++)
{
Console.WriteLine(dates[ctr].ToString("f"));
output += dates[ctr].ToUniversalTime().ToString("O", CultureInfo.InvariantCulture)
+ (ctr != dates.Length - 1 ? "|" : "");
}
var sw = new StreamWriter(filenameTxt);
sw.Write(output);
sw.Close();
Console.WriteLine("Saved dates...");
}
private static void RestoreDatesAsInvariantStrings()
{
TimeZoneInfo.ClearCachedData();
Console.WriteLine($"Current Time Zone: {TimeZoneInfo.Local.DisplayName}");
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-GB");
StreamReader sr = new StreamReader(filenameTxt);
string[] inputValues = sr.ReadToEnd().Split(new char[] { '|' },
StringSplitOptions.RemoveEmptyEntries);
sr.Close();
Console.WriteLine($"The dates on an {Thread.CurrentThread.CurrentCulture.Name} system:");
foreach (var inputValue in inputValues)
{
DateTime dateValue;
if (DateTime.TryParseExact(inputValue, "O", CultureInfo.InvariantCulture,
DateTimeStyles.RoundtripKind, out dateValue))
{
Console.WriteLine($"'{inputValue}' --> {dateValue.ToLocalTime():f}");
}
else
{
Console.WriteLine($"Cannot parse '{inputValue}'");
}
}
Console.WriteLine("Restored dates...");
}
// When saved on an en-US system, the example displays the following output:
// Current Time Zone: (UTC-08:00) Pacific Time (US & Canada)
// The dates on an en-US system:
// Saturday, June 14, 2014 6:32 AM
// Thursday, July 10, 2014 11:49 PM
// Saturday, January 10, 2015 1:16 AM
// Saturday, December 20, 2014 9:45 PM
// Monday, June 02, 2014 3:14 PM
// Saved dates...
//
// When restored on an en-GB system, the example displays the following output:
// Current Time Zone: (UTC) Dublin, Edinburgh, Lisbon, London
// The dates on an en-GB system:
// '2014-06-14T13:32:00.0000000Z' --> 14 June 2014 14:32
// '2014-07-11T06:49:00.0000000Z' --> 11 July 2014 07:49
// '2015-01-10T09:16:00.0000000Z' --> 10 January 2015 09:16
// '2014-12-21T05:45:00.0000000Z' --> 21 December 2014 05:45
// '2014-06-02T22:14:00.0000000Z' --> 02 June 2014 23:14
// Restored dates...
let saveDatesAsInvariantStrings () =
let dates =
[ DateTime(2014, 6, 14, 6, 32, 0)
DateTime(2014, 7, 10, 23, 49, 0)
DateTime(2015, 1, 10, 1, 16, 0)
DateTime(2014, 12, 20, 21, 45, 0)
DateTime(2014, 6, 2, 15, 14, 0) ]
printfn $"Current Time Zone: {TimeZoneInfo.Local.DisplayName}"
printfn $"The dates on an {Thread.CurrentThread.CurrentCulture.Name} system:"
let output =
[ for date in dates do
printfn $"{date:f}"
date.ToUniversalTime().ToString("O", CultureInfo.InvariantCulture) ]
|> String.concat "|"
use sw = new StreamWriter(filenameTxt)
sw.Write output
printfn "Saved dates..."
let restoreDatesAsInvariantStrings () =
TimeZoneInfo.ClearCachedData()
printfn $"Current Time Zone: {TimeZoneInfo.Local.DisplayName}"
Thread.CurrentThread.CurrentCulture <- CultureInfo.CreateSpecificCulture "en-GB"
use sr = new StreamReader(filenameTxt)
let inputValues =
sr.ReadToEnd().Split('|', StringSplitOptions.RemoveEmptyEntries)
printfn $"The dates on an {Thread.CurrentThread.CurrentCulture.Name} system:"
for inputValue in inputValues do
match DateTime.TryParseExact(inputValue, "O", CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind) with
| true, dateValue ->
printfn $"'{inputValue}' --> {dateValue.ToLocalTime():f}"
| _ ->
printfn $"Cannot parse '{inputValue}'"
printfn "Restored dates..."
let persistAsInvariantStrings () =
saveDatesAsInvariantStrings ()
restoreDatesAsInvariantStrings ()
// When saved on an en-US system, the example displays the following output:
// Current Time Zone: (UTC-08:00) Pacific Time (US & Canada)
// The dates on an en-US system:
// Saturday, June 14, 2014 6:32 AM
// Thursday, July 10, 2014 11:49 PM
// Saturday, January 10, 2015 1:16 AM
// Saturday, December 20, 2014 9:45 PM
// Monday, June 02, 2014 3:14 PM
// Saved dates...
//
// When restored on an en-GB system, the example displays the following output:
// Current Time Zone: (UTC) Dublin, Edinburgh, Lisbon, London
// The dates on an en-GB system:
// '2014-06-14T13:32:00.0000000Z' --> 14 June 2014 14:32
// '2014-07-11T06:49:00.0000000Z' --> 11 July 2014 07:49
// '2015-01-10T09:16:00.0000000Z' --> 10 January 2015 09:16
// '2014-12-21T05:45:00.0000000Z' --> 21 December 2014 05:45
// '2014-06-02T22:14:00.0000000Z' --> 02 June 2014 23:14
// Restored dates...
Mempertahankan nilai sebagai bilangan bulat
Anda dapat mempertahankan tanggal dan waktu sebagai nilai Int64 yang mewakili sejumlah tanda centang. Dalam hal ini, Anda tidak perlu mempertimbangkan budaya sistem tempat nilai DateTime dipertahankan dan dipulihkan.
Untuk mempertahankan nilai DateTime sebagai bilangan bulat:
- Jika nilai DateTime mewakili satu momen tepat waktu, konversikan ke UTC dengan memanggil metode ToUniversalTime.
- Ambil jumlah tanda centang yang diwakili oleh nilai DateTime dari properti Ticks.
Untuk memulihkan nilai DateTime yang telah dipertahankan sebagai bilangan bulat:
- Buat instans objek DateTime baru dengan meneruskan nilai Int64 ke konstruktor DateTime(Int64).
- Jika nilai DateTime mewakili satu momen dalam waktu tertentu, konversikan dari UTC ke waktu lokal dengan memanggil metode ToLocalTime.
Contoh berikut mempertahankan array nilai DateTime sebagai bilangan bulat pada sistem di zona Waktu Pasifik A.S. Ini memulihkannya pada sistem di zona UTC. File yang berisi bilangan bulat menyertakan nilai Int32 yang menunjukkan jumlah total nilai Int64 yang segera mengikutinya.
public static void PersistAsIntegers()
{
SaveDatesAsInts();
RestoreDatesAsInts();
}
private static void SaveDatesAsInts()
{
DateTime[] dates = { new DateTime(2014, 6, 14, 6, 32, 0),
new DateTime(2014, 7, 10, 23, 49, 0),
new DateTime(2015, 1, 10, 1, 16, 0),
new DateTime(2014, 12, 20, 21, 45, 0),
new DateTime(2014, 6, 2, 15, 14, 0) };
Console.WriteLine($"Current Time Zone: {TimeZoneInfo.Local.DisplayName}");
Console.WriteLine($"The dates on an {Thread.CurrentThread.CurrentCulture.Name} system:");
var ticks = new long[dates.Length];
for (int ctr = 0; ctr < dates.Length; ctr++)
{
Console.WriteLine(dates[ctr].ToString("f"));
ticks[ctr] = dates[ctr].ToUniversalTime().Ticks;
}
var fs = new FileStream(filenameInts, FileMode.Create);
var bw = new BinaryWriter(fs);
bw.Write(ticks.Length);
foreach (var tick in ticks)
bw.Write(tick);
bw.Close();
Console.WriteLine("Saved dates...");
}
private static void RestoreDatesAsInts()
{
TimeZoneInfo.ClearCachedData();
Console.WriteLine($"Current Time Zone: {TimeZoneInfo.Local.DisplayName}");
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-GB");
FileStream fs = new FileStream(filenameInts, FileMode.Open);
BinaryReader br = new BinaryReader(fs);
int items;
DateTime[] dates;
try
{
items = br.ReadInt32();
dates = new DateTime[items];
for (int ctr = 0; ctr < items; ctr++)
{
long ticks = br.ReadInt64();
dates[ctr] = new DateTime(ticks).ToLocalTime();
}
}
catch (EndOfStreamException)
{
Console.WriteLine("File corruption detected. Unable to restore data...");
return;
}
catch (IOException)
{
Console.WriteLine("Unspecified I/O error. Unable to restore data...");
return;
}
// Thrown during array initialization.
catch (OutOfMemoryException)
{
Console.WriteLine("File corruption detected. Unable to restore data...");
return;
}
finally
{
br.Close();
}
Console.WriteLine($"The dates on an {Thread.CurrentThread.CurrentCulture.Name} system:");
foreach (var value in dates)
Console.WriteLine(value.ToString("f"));
Console.WriteLine("Restored dates...");
}
// When saved on an en-US system, the example displays the following output:
// Current Time Zone: (UTC-08:00) Pacific Time (US & Canada)
// The dates on an en-US system:
// Saturday, June 14, 2014 6:32 AM
// Thursday, July 10, 2014 11:49 PM
// Saturday, January 10, 2015 1:16 AM
// Saturday, December 20, 2014 9:45 PM
// Monday, June 02, 2014 3:14 PM
// Saved dates...
//
// When restored on an en-GB system, the example displays the following output:
// Current Time Zone: (UTC) Dublin, Edinburgh, Lisbon, London
// The dates on an en-GB system:
// 14 June 2014 14:32
// 11 July 2014 07:49
// 10 January 2015 09:16
// 21 December 2014 05:45
// 02 June 2014 23:14
// Restored dates...
let saveDatesAsInts () =
let dates =
[ DateTime(2014, 6, 14, 6, 32, 0)
DateTime(2014, 7, 10, 23, 49, 0)
DateTime(2015, 1, 10, 1, 16, 0)
DateTime(2014, 12, 20, 21, 45, 0)
DateTime(2014, 6, 2, 15, 14, 0) ]
printfn $"Current Time Zone: {TimeZoneInfo.Local.DisplayName}"
printfn $"The dates on an {Thread.CurrentThread.CurrentCulture.Name} system:"
let ticks =
[| for date in dates do
printfn $"{date:f}"
date.ToUniversalTime().Ticks |]
use fs = new FileStream(filenameInts, FileMode.Create)
use bw = new BinaryWriter(fs)
bw.Write ticks.Length
for tick in ticks do
bw.Write tick
printfn "Saved dates..."
let restoreDatesAsInts () =
TimeZoneInfo.ClearCachedData()
printfn $"Current Time Zone: {TimeZoneInfo.Local.DisplayName}"
Thread.CurrentThread.CurrentCulture <- CultureInfo.CreateSpecificCulture "en-GB"
use fs = new FileStream(filenameInts, FileMode.Open)
use br = new BinaryReader(fs)
try
let items = br.ReadInt32()
let dates =
[| for _ in 0..items do
let ticks = br.ReadInt64()
DateTime(ticks).ToLocalTime() |]
printfn $"The dates on an {Thread.CurrentThread.CurrentCulture.Name} system:"
for value in dates do
printfn $"{value:f}"
with
| :? EndOfStreamException ->
printfn "File corruption detected. Unable to restore data..."
| :? IOException ->
printfn "Unspecified I/O error. Unable to restore data..."
// Thrown during array initialization.
| :? OutOfMemoryException ->
printfn"File corruption detected. Unable to restore data..."
printfn "Restored dates..."
let persistAsIntegers () =
saveDatesAsInts ()
restoreDatesAsInts ()
// When saved on an en-US system, the example displays the following output:
// Current Time Zone: (UTC-08:00) Pacific Time (US & Canada)
// The dates on an en-US system:
// Saturday, June 14, 2014 6:32 AM
// Thursday, July 10, 2014 11:49 PM
// Saturday, January 10, 2015 1:16 AM
// Saturday, December 20, 2014 9:45 PM
// Monday, June 02, 2014 3:14 PM
// Saved dates...
//
// When restored on an en-GB system, the example displays the following output:
// Current Time Zone: (UTC) Dublin, Edinburgh, Lisbon, London
// The dates on an en-GB system:
// 14 June 2014 14:32
// 11 July 2014 07:49
// 10 January 2015 09:16
// 21 December 2014 05:45
// 02 June 2014 23:14
// Restored dates...
Menserialisasikan nilai DateTime
Anda dapat mempertahankan nilai DateTime melalui serialisasi ke aliran atau file, lalu memulihkannya melalui deserialisasi. DateTime data diserialisasikan dalam beberapa format objek tertentu. Objek dipulihkan saat dideserialisasi. Formatter atau serializer, seperti JsonSerializer atau XmlSerializer, menangani proses serialisasi dan deserialisasi. Untuk informasi selengkapnya tentang serialisasi dan jenis serialisasi yang didukung oleh .NET, lihat Serialisasi.
Contoh berikut menggunakan kelas XmlSerializer untuk menserialisasikan dan mendeserialisasi nilai DateTime. Nilai mewakili semua hari tahun kabisat pada abad kedua puluh pertama. Output mewakili hasil jika contoh dijalankan pada sistem yang budayanya saat ini adalah Inggris (Inggris). Karena Anda telah mendeserialisasi objek DateTime itu sendiri, kode tidak perlu menangani perbedaan budaya dalam format tanggal dan waktu.
public static void PersistAsXML()
{
// Serialize the data.
var leapYears = new List<DateTime>();
for (int year = 2000; year <= 2100; year += 4)
{
if (DateTime.IsLeapYear(year))
leapYears.Add(new DateTime(year, 2, 29));
}
DateTime[] dateArray = leapYears.ToArray();
var serializer = new XmlSerializer(dateArray.GetType());
TextWriter sw = new StreamWriter(filenameXml);
try
{
serializer.Serialize(sw, dateArray);
}
catch (InvalidOperationException e)
{
Console.WriteLine(e.InnerException?.Message);
}
finally
{
if (sw != null) sw.Close();
}
// Deserialize the data.
DateTime[]? deserializedDates;
using (var fs = new FileStream(filenameXml, FileMode.Open))
{
deserializedDates = (DateTime[]?)serializer.Deserialize(fs);
}
// Display the dates.
Console.WriteLine($"Leap year days from 2000-2100 on an {Thread.CurrentThread.CurrentCulture.Name} system:");
int nItems = 0;
if (deserializedDates is not null)
{
foreach (var dat in deserializedDates)
{
Console.Write($" {dat:d} ");
nItems++;
if (nItems % 5 == 0)
Console.WriteLine();
}
}
}
// The example displays the following output:
// Leap year days from 2000-2100 on an en-GB system:
// 29/02/2000 29/02/2004 29/02/2008 29/02/2012 29/02/2016
// 29/02/2020 29/02/2024 29/02/2028 29/02/2032 29/02/2036
// 29/02/2040 29/02/2044 29/02/2048 29/02/2052 29/02/2056
// 29/02/2060 29/02/2064 29/02/2068 29/02/2072 29/02/2076
// 29/02/2080 29/02/2084 29/02/2088 29/02/2092 29/02/2096
let persistAsXML () =
// Serialize the data.
let leapYears =
[| for year in 2000..4..2100 do
if DateTime.IsLeapYear year then
DateTime(year, 2, 29) |]
let serializer = XmlSerializer(leapYears.GetType())
use sw = new StreamWriter(filenameXml)
try
serializer.Serialize(sw, leapYears)
with :? InvalidOperationException as e ->
printfn $"{e.InnerException.Message}"
// Deserialize the data.
use fs = new FileStream(filenameXml, FileMode.Open)
let deserializedDates = serializer.Deserialize fs :?> DateTime []
// Display the dates.
printfn $"Leap year days from 2000-2100 on an {Thread.CurrentThread.CurrentCulture.Name} system:"
let mutable nItems = 0
for dat in deserializedDates do
printf $" {dat:d} "
nItems <- nItems + 1
if nItems % 5 = 0 then
printfn ""
// The example displays the following output:
// Leap year days from 2000-2100 on an en-GB system:
// 29/02/2000 29/02/2004 29/02/2008 29/02/2012 29/02/2016
// 29/02/2020 29/02/2024 29/02/2028 29/02/2032 29/02/2036
// 29/02/2040 29/02/2044 29/02/2048 29/02/2052 29/02/2056
// 29/02/2060 29/02/2064 29/02/2068 29/02/2072 29/02/2076
// 29/02/2080 29/02/2084 29/02/2088 29/02/2092 29/02/2096
Contoh sebelumnya tidak menyertakan informasi waktu. Jika nilai DateTime mewakili momen tepat waktu dan dinyatakan sebagai waktu lokal, konversikan dari waktu lokal ke UTC sebelum menserialisasikannya dengan memanggil metode ToUniversalTime. Setelah Anda mendeserialisasinya, konversikan dari UTC ke waktu lokal dengan memanggil metode ToLocalTime.
DateTime vs. TimeSpan
Jenis nilai DateTime dan TimeSpan berbeda di mana DateTime mewakili waktu instan sedangkan TimeSpan mewakili interval waktu. Anda dapat mengurangi satu instans DateTime dari instans lain untuk mendapatkan objek TimeSpan yang mewakili interval waktu di antaranya. Atau Anda dapat menambahkan TimeSpan positif ke DateTime saat ini untuk mendapatkan nilai DateTime yang mewakili tanggal mendatang.
Anda dapat menambahkan atau mengurangi interval waktu dari objek DateTime. Interval waktu bisa negatif atau positif, dan dapat diekspresikan dalam unit seperti tanda centang, detik, atau sebagai objek TimeSpan.
Bandingkan untuk kesetaraan dalam toleransi
Perbandingan kesetaraan untuk nilai DateTime tepat. Agar dianggap sama, dua nilai harus dinyatakan sebagai jumlah tanda centang yang sama. Presisi tersebut sering kali tidak perlu atau bahkan salah untuk banyak aplikasi. Seringkali, Anda ingin menguji apakah objek DateTimekira-kira sama dengan.
Contoh berikut menunjukkan cara membandingkan nilai DateTime yang kira-kira setara. Ini menerima sedikit margin perbedaan ketika menyatakannya setara.
public static bool RoughlyEquals(DateTime time, DateTime timeWithWindow, int windowInSeconds, int frequencyInSeconds)
{
long delta = (long)((TimeSpan)(timeWithWindow - time)).TotalSeconds % frequencyInSeconds;
delta = delta > windowInSeconds ? frequencyInSeconds - delta : delta;
return Math.Abs(delta) < windowInSeconds;
}
public static void TestRoughlyEquals()
{
int window = 10;
int freq = 60 * 60 * 2; // 2 hours;
DateTime d1 = DateTime.Now;
DateTime d2 = d1.AddSeconds(2 * window);
DateTime d3 = d1.AddSeconds(-2 * window);
DateTime d4 = d1.AddSeconds(window / 2);
DateTime d5 = d1.AddSeconds(-window / 2);
DateTime d6 = (d1.AddHours(2)).AddSeconds(2 * window);
DateTime d7 = (d1.AddHours(2)).AddSeconds(-2 * window);
DateTime d8 = (d1.AddHours(2)).AddSeconds(window / 2);
DateTime d9 = (d1.AddHours(2)).AddSeconds(-window / 2);
Console.WriteLine($"d1 ({d1}) ~= d1 ({d1}): {RoughlyEquals(d1, d1, window, freq)}");
Console.WriteLine($"d1 ({d1}) ~= d2 ({d2}): {RoughlyEquals(d1, d2, window, freq)}");
Console.WriteLine($"d1 ({d1}) ~= d3 ({d3}): {RoughlyEquals(d1, d3, window, freq)}");
Console.WriteLine($"d1 ({d1}) ~= d4 ({d4}): {RoughlyEquals(d1, d4, window, freq)}");
Console.WriteLine($"d1 ({d1}) ~= d5 ({d5}): {RoughlyEquals(d1, d5, window, freq)}");
Console.WriteLine($"d1 ({d1}) ~= d6 ({d6}): {RoughlyEquals(d1, d6, window, freq)}");
Console.WriteLine($"d1 ({d1}) ~= d7 ({d7}): {RoughlyEquals(d1, d7, window, freq)}");
Console.WriteLine($"d1 ({d1}) ~= d8 ({d8}): {RoughlyEquals(d1, d8, window, freq)}");
Console.WriteLine($"d1 ({d1}) ~= d9 ({d9}): {RoughlyEquals(d1, d9, window, freq)}");
}
// The example displays output similar to the following:
// d1 (1/28/2010 9:01:26 PM) ~= d1 (1/28/2010 9:01:26 PM): True
// d1 (1/28/2010 9:01:26 PM) ~= d2 (1/28/2010 9:01:46 PM): False
// d1 (1/28/2010 9:01:26 PM) ~= d3 (1/28/2010 9:01:06 PM): False
// d1 (1/28/2010 9:01:26 PM) ~= d4 (1/28/2010 9:01:31 PM): True
// d1 (1/28/2010 9:01:26 PM) ~= d5 (1/28/2010 9:01:21 PM): True
// d1 (1/28/2010 9:01:26 PM) ~= d6 (1/28/2010 11:01:46 PM): False
// d1 (1/28/2010 9:01:26 PM) ~= d7 (1/28/2010 11:01:06 PM): False
// d1 (1/28/2010 9:01:26 PM) ~= d8 (1/28/2010 11:01:31 PM): True
// d1 (1/28/2010 9:01:26 PM) ~= d9 (1/28/2010 11:01:21 PM): True
let roughlyEquals (time: DateTime) (timeWithWindow: DateTime) windowInSeconds frequencyInSeconds =
let delta =
int64 (timeWithWindow - time).TotalSeconds % frequencyInSeconds
let delta = if delta > windowInSeconds then frequencyInSeconds - delta else delta
abs delta < windowInSeconds
let testRoughlyEquals () =
let window = 10
let window' = 10.
let freq = 60 * 60 * 2 // 2 hours
let d1 = DateTime.Now
let d2 = d1.AddSeconds(2. * window')
let d3 = d1.AddSeconds(-2. * window')
let d4 = d1.AddSeconds(window' / 2.)
let d5 = d1.AddSeconds(-window' / 2.)
let d6 = (d1.AddHours 2).AddSeconds(2. * window')
let d7 = (d1.AddHours 2).AddSeconds(-2. * window')
let d8 = (d1.AddHours 2).AddSeconds(window' / 2.)
let d9 = (d1.AddHours 2).AddSeconds(-window' / 2.)
printfn $"d1 ({d1}) ~= d1 ({d1}): {roughlyEquals d1 d1 window freq}"
printfn $"d1 ({d1}) ~= d2 ({d2}): {roughlyEquals d1 d2 window freq}"
printfn $"d1 ({d1}) ~= d3 ({d3}): {roughlyEquals d1 d3 window freq}"
printfn $"d1 ({d1}) ~= d4 ({d4}): {roughlyEquals d1 d4 window freq}"
printfn $"d1 ({d1}) ~= d5 ({d5}): {roughlyEquals d1 d5 window freq}"
printfn $"d1 ({d1}) ~= d6 ({d6}): {roughlyEquals d1 d6 window freq}"
printfn $"d1 ({d1}) ~= d7 ({d7}): {roughlyEquals d1 d7 window freq}"
printfn $"d1 ({d1}) ~= d8 ({d8}): {roughlyEquals d1 d8 window freq}"
printfn $"d1 ({d1}) ~= d9 ({d9}): {roughlyEquals d1 d9 window freq}"
// The example displays output similar to the following:
// d1 (1/28/2010 9:01:26 PM) ~= d1 (1/28/2010 9:01:26 PM): True
// d1 (1/28/2010 9:01:26 PM) ~= d2 (1/28/2010 9:01:46 PM): False
// d1 (1/28/2010 9:01:26 PM) ~= d3 (1/28/2010 9:01:06 PM): False
// d1 (1/28/2010 9:01:26 PM) ~= d4 (1/28/2010 9:01:31 PM): True
// d1 (1/28/2010 9:01:26 PM) ~= d5 (1/28/2010 9:01:21 PM): True
// d1 (1/28/2010 9:01:26 PM) ~= d6 (1/28/2010 11:01:46 PM): False
// d1 (1/28/2010 9:01:26 PM) ~= d7 (1/28/2010 11:01:06 PM): False
// d1 (1/28/2010 9:01:26 PM) ~= d8 (1/28/2010 11:01:31 PM): True
// d1 (1/28/2010 9:01:26 PM) ~= d9 (1/28/2010 11:01:21 PM): True
Public Shared Function RoughlyEquals(time As DateTime, timeWithWindow As DateTime,
windowInSeconds As Integer,
frequencyInSeconds As Integer) As Boolean
Dim delta As Long = (timeWithWindow.Subtract(time)).TotalSeconds _
Mod frequencyInSeconds
If delta > windowInSeconds Then
delta = frequencyInSeconds - delta
End If
Return Math.Abs(delta) < windowInSeconds
End Function
Public Shared Sub TestRoughlyEquals()
Dim window As Integer = 10
Dim freq As Integer = 60 * 60 * 2 ' 2 hours;
Dim d1 As DateTime = DateTime.Now
Dim d2 As DateTime = d1.AddSeconds(2 * window)
Dim d3 As DateTime = d1.AddSeconds(-2 * window)
Dim d4 As DateTime = d1.AddSeconds(window / 2)
Dim d5 As DateTime = d1.AddSeconds(-window / 2)
Dim d6 As DateTime = d1.AddHours(2).AddSeconds(2 * window)
Dim d7 As DateTime = d1.AddHours(2).AddSeconds(-2 * window)
Dim d8 As DateTime = d1.AddHours(2).AddSeconds(window / 2)
Dim d9 As DateTime = d1.AddHours(2).AddSeconds(-window / 2)
Console.WriteLine($"d1 ({d1}) ~= d1 ({d1}): {RoughlyEquals(d1, d1, window, freq)}")
Console.WriteLine($"d1 ({d1}) ~= d2 ({d2}): {RoughlyEquals(d1, d2, window, freq)}")
Console.WriteLine($"d1 ({d1}) ~= d3 ({d3}): {RoughlyEquals(d1, d3, window, freq)}")
Console.WriteLine($"d1 ({d1}) ~= d4 ({d4}): {RoughlyEquals(d1, d4, window, freq)}")
Console.WriteLine($"d1 ({d1}) ~= d5 ({d5}): {RoughlyEquals(d1, d5, window, freq)}")
Console.WriteLine($"d1 ({d1}) ~= d6 ({d6}): {RoughlyEquals(d1, d6, window, freq)}")
Console.WriteLine($"d1 ({d1}) ~= d7 ({d7}): {RoughlyEquals(d1, d7, window, freq)}")
Console.WriteLine($"d1 ({d1}) ~= d8 ({d8}): {RoughlyEquals(d1, d8, window, freq)}")
Console.WriteLine($"d1 ({d1}) ~= d9 ({d9}): {RoughlyEquals(d1, d9, window, freq)}")
End Sub
' The example displays output similar to the following:
' d1 (1/28/2010 9:01:26 PM) ~= d1 (1/28/2010 9:01:26 PM): True
' d1 (1/28/2010 9:01:26 PM) ~= d2 (1/28/2010 9:01:46 PM): False
' d1 (1/28/2010 9:01:26 PM) ~= d3 (1/28/2010 9:01:06 PM): False
' d1 (1/28/2010 9:01:26 PM) ~= d4 (1/28/2010 9:01:31 PM): True
' d1 (1/28/2010 9:01:26 PM) ~= d5 (1/28/2010 9:01:21 PM): True
' d1 (1/28/2010 9:01:26 PM) ~= d6 (1/28/2010 11:01:46 PM): False
' d1 (1/28/2010 9:01:26 PM) ~= d7 (1/28/2010 11:01:06 PM): False
' d1 (1/28/2010 9:01:26 PM) ~= d8 (1/28/2010 11:01:31 PM): True
' d1 (1/28/2010 9:01:26 PM) ~= d9 (1/28/2010 11:01:21 PM): True
Pertimbangan interoperabilitas COM
Nilai DateTime yang ditransfer ke aplikasi COM, kemudian ditransfer kembali ke aplikasi terkelola, dikatakan untuk pulang-pergi. Namun, nilai DateTime yang hanya menentukan waktu tidak melakukan perjalanan pulang pergi seperti yang mungkin Anda harapkan.
Jika Anda hanya menyebutkan waktu, seperti pukul 15.00, tanggal dan waktu akhirnya adalah 30 Desember 1899 M. pada pukul 15.00, bukan 1 Januari 0001 M. pada pukul 15.00. .NET dan COM mengasumsikan tanggal default ketika hanya waktu yang ditentukan. Namun, sistem COM mengasumsikan tanggal dasar 30 Desember 1899 C.E., sementara .NET mengasumsikan tanggal dasar Januari, 1, 0001 C.E.
Ketika hanya waktu yang diteruskan dari .NET ke COM, pemrosesan khusus dilakukan yang mengonversi waktu ke format yang digunakan oleh COM. Ketika hanya jam yang diteruskan dari COM ke .NET, tidak ada pemrosesan khusus yang dilakukan karena hal ini bisa merusak tanggal dan jam yang sah pada atau sebelum 30 Desember 1899. Jika tanggal memulai siklus dari COM, .NET dan COM masing-masing mempertahankan tanggal tersebut.
Perilaku .NET dan COM menunjukkan bahwa jika aplikasi Anda melakukan siklus ulang untuk DateTime yang hanya menentukan waktu, aplikasi Anda harus mengingat untuk memodifikasi atau mengabaikan tanggal yang salah dari objek DateTime yang terakhir.