Hampir semua aplikasi menyimpan momen waktu: tanggal transaksi, jadwal rapat, atau masa berlaku kupon. C# menyediakan struct DateTime di namespace System untuk kebutuhan tersebut. Nilai DateTime tersusun dari jumlah tick (satuan 100 nanodetik) sejak 1 Januari 0001, dan struct ini bersifat immutable: setiap operasi aritmetika mengembalikan nilai baru, bukan mengubah nilai lama.

Tiga Nilai Kind #

Setiap DateTime membawa penanda Kind yang menjelaskan sudut pandang waktunya:

KindMakna
UnspecifiedWaktu tanpa keterangan zona
UtcWaktu koordinat universal
LocalWaktu sesuai zona mesin yang menjalankan program

Membuat dan Membaca DateTime #

csharp
DateTime kemerdekaan = new DateTime(2025, 8, 17);
DateTime rapat = new DateTime(2025, 8, 17, 10, 30, 0);

Console.WriteLine(kemerdekaan.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture));
Console.WriteLine(rapat.ToString("yyyy-MM-dd HH:mm", CultureInfo.InvariantCulture));
Console.WriteLine(rapat.Year);
Console.WriteLine(rapat.Kind);

Output yang Dihasilkan:

text
2025-08-17
2025-08-17 10:30
2025
Unspecified

Mari kita bedah baris demi baris:

  1. Baris 1 (new DateTime(2025, 8, 17)): konstruktor mengisi jam 00:00:00 secara otomatis karena argumen jam tidak diberikan; cocok untuk tanggal kalender murni.
  2. Baris 2 (new DateTime(2025, 8, 17, 10, 30, 0)): versi konstruktor lengkap menentukan jam, menit, dan detik.
  3. Baris 4-5 (ToString ...): pola format kustom yyyy-MM-dd dan yyyy-MM-dd HH:mm dicetak dengan CultureInfo.InvariantCulture agar keluaran tidak berubah antar mesin.
  4. Baris 7 (rapat.Kind): object yang dibuat lewat konstruktor berparameter angka berstatus Unspecified, sebab kita belum menyatakan zona waktunya.

Properti kalender lain dibaca dengan cara yang sama: Month, Day, Hour, DayOfWeek, dan DayOfYear mengembalikan komponen sesuai nilai yang tersimpan. Untuk aritmetika, method seperti AddDays dan AddMonths menghitung komponen kalender dengan benar, misalnya menambah satu bulan pada 31 Januari menghasilkan akhir Februari, bukan tanggal yang tidak sah.