Aplikasi yang melayani pengguna di banyak kota tidak boleh menganggap semua jam sama. TimeZoneInfo di namespace System menyimpan aturan resmi satu zona waktu: offsetnya, aturan daylight saving, dan sejarah perubahannya. Zona dicari lewat identifier; Linux, macOS, dan container umumnya memakai identifier IANA seperti Asia/Jakarta, sedangkan Windows memakai nama khusus seperti SE Asia Standard Time.

Mencari Zona dan Mengonversi #

csharp
TimeZoneInfo jakarta = TimeZoneInfo.FindSystemTimeZoneById("Asia/Jakarta");

DateTime utc = new DateTime(2025, 8, 17, 3, 30, 0, DateTimeKind.Utc);
DateTime wib = TimeZoneInfo.ConvertTimeFromUtc(utc, jakarta);

Console.WriteLine(wib.ToString("yyyy-MM-dd HH:mm", CultureInfo.InvariantCulture));
Console.WriteLine(jakarta.BaseUtcOffset);
Console.WriteLine(jakarta.IsDaylightSavingTime(utc));

Output yang Dihasilkan:

text
2025-08-17 10:30
07:00:00
False

Mari kita bedah baris demi baris:

  1. Baris 1 (FindSystemTimeZoneById): runtime membaca database zona (tzdata) dan mengembalikan object TimeZoneInfo untuk Asia/Jakarta; identifier yang tidak dikenal melempar TimeZoneNotFoundException.
  2. Baris 3 (new DateTime ... DateTimeKind.Utc): titik acuan 03:30 UTC dibuat dengan Kind eksplisit agar ConvertTimeFromUtc tidak salah menafsir sumber waktunya.
  3. Baris 4 (ConvertTimeFromUtc): runtime menambahkan offset zona ke titik UTC dan menghasilkan 10:30, jam dinding yang benar di Jakarta.
  4. Baris 6 (BaseUtcOffset): offset standar zona adalah 07:00:00, konsisten dengan istilah WIB.
  5. Baris 7 (IsDaylightSavingTime): Indonesia tidak menerapkan daylight saving, sehingga hasilnya False sepanjang tahun.

Object TimeZoneInfo bersifat immutable dan aman dipakai bersama, sehingga pemanggilan FindSystemTimeZoneById cukup dilakukan sekali dan hasilnya disimpan sebagai field static. Untuk zona dengan daylight saving, ConvertTimeFromUtc otomatis menerapkan aturan musiman sesuai tanggal yang dikonversi; kita tidak perlu menambah atau mengurangi jam secara manual, dan itulah alasan konversi manual dengan penjumlahan TimeSpan sebaiknya ditinggalkan.