DateTime hanya menyimpan angka waktu dan penanda Kind; dua aplikasi di zona berbeda dapat menyimpan 10:30 yang berarti momen berbeda. Struct DateTimeOffset menutup celah itu dengan menyimpan waktu sekaligus offset: selisih terhadap UTC dalam TimeSpan. Dua nilai DateTimeOffset dengan angka jam sama tetapi offset berbeda mewakili momen yang berbeda, sehingga satu nilai saja sudah cukup unik.
Kenapa Offset Penting #
- Pencatatan log dan transaksi lintas negara membutuhkan urutan momen yang tidak ambigu.
- Perbandingan
DateTimeOffsetmenghitung offset, bukan hanya angka jam. - Properti
UtcDateTimememberi pandangan UTC tanpa konversi manual.
Contoh Pembuatan dan Pembacaan #
var rapat = new DateTimeOffset(2025, 8, 17, 10, 30, 0, TimeSpan.FromHours(7));
Console.WriteLine(rapat.ToString("yyyy-MM-dd HH:mm zzz", CultureInfo.InvariantCulture));
Console.WriteLine(rapat.UtcDateTime.ToString("yyyy-MM-dd HH:mm", CultureInfo.InvariantCulture));
Console.WriteLine(rapat.Offset);Output yang Dihasilkan:
2025-08-17 10:30 +07:00
2025-08-17 03:30
07:00:00Mari kita bedah baris demi baris:
- Baris 1 (
new DateTimeOffset ...): waktu 10:30 dipasangkan dengan offsetTimeSpan.FromHours(7), yaitu zona WIB (Waktu Indonesia Barat). - Baris 3 (
ToString ... zzz): penentu formatzzzmencetak offset sebagai+07:00di belakang jam, sehingga pembaca log tahu sudut pandang waktunya. - Baris 4 (
UtcDateTime): runtime mengurangi offset 7 jam dan menghasilkan03:30; momen yang sama dilihat dari UTC. - Baris 5 (
rapat.Offset): propertiOffsetmengembalikanTimeSpan07:00:00 yang melekat pada nilai tersebut.
DateTimeOffset juga dapat dibuat dari DateTime melalui konstruktor new DateTimeOffset(dt, offset), dan nilai default tanpa argumen offset mengikuti zona lokal mesin. Perbandingan dua nilai menggunakan momen sesungguhnya: 10:30 +07:00 sama dengan 03:30 +00:00 sehingga operator == menganggap keduanya setara.