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 DateTimeOffset menghitung offset, bukan hanya angka jam.
  • Properti UtcDateTime memberi pandangan UTC tanpa konversi manual.

Contoh Pembuatan dan Pembacaan #

csharp
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:

text
2025-08-17 10:30 +07:00
2025-08-17 03:30
07:00:00

Mari kita bedah baris demi baris:

  1. Baris 1 (new DateTimeOffset ...): waktu 10:30 dipasangkan dengan offset TimeSpan.FromHours(7), yaitu zona WIB (Waktu Indonesia Barat).
  2. Baris 3 (ToString ... zzz): penentu format zzz mencetak offset sebagai +07:00 di belakang jam, sehingga pembaca log tahu sudut pandang waktunya.
  3. Baris 4 (UtcDateTime): runtime mengurangi offset 7 jam dan menghasilkan 03:30; momen yang sama dilihat dari UTC.
  4. Baris 5 (rapat.Offset): properti Offset mengembalikan TimeSpan 07: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.