Seluruh bab section ini bermuara pada satu disiplin kerja: data di dalam sistem memakai bentuk netral, sedangkan bentuk budaya hanya hadir di tepi antarmuka. Bab ini merangkum praktik tersebut dan menunjukkan satu contoh yang menggabungkan penyimpanan, parsing, konversi zona, dan penampilan dalam satu alur.

Praktik Utama #

  • Simpan dan kirim waktu sebagai UTC atau DateTimeOffset, bukan waktu lokal tanpa zona.
  • Gunakan CultureInfo.InvariantCulture untuk format dan parsing data mesin ke mesin.
  • Berikan CultureInfo pengguna hanya pada lapisan tampilan.
  • Sertakan culture secara eksplisit pada setiap Parse; parser tanpa culture mengikuti mesin.
  • Pilih comparer secara sadar: ordinal untuk data mesin, comparer culture untuk daftar pengguna.

Contoh Alur Lengkap #

csharp
DateTimeOffset acara = new DateTimeOffset(2025, 8, 17, 10, 30, 0, TimeSpan.FromHours(7));

string tersimpan = acara.ToString("O", CultureInfo.InvariantCulture);
Console.WriteLine(tersimpan);

DateTimeOffset dibaca = DateTimeOffset.Parse(tersimpan, CultureInfo.InvariantCulture);

TimeZoneInfo jakarta = TimeZoneInfo.FindSystemTimeZoneById("Asia/Jakarta");
string tampil = TimeZoneInfo.ConvertTime(dibaca, jakarta)
    .ToString("dd MMMM yyyy HH:mm", CultureInfo.GetCultureInfo("id-ID"));
Console.WriteLine(tampil);

Output yang Dihasilkan:

text
2025-08-17T10:30:00.0000000+07:00
17 Agustus 2025 10.30

Mari kita bedah kedua baris keluaran:

  1. Format "O" (round-trip): pola ISO 8601 membawa tanggal, jam berpresisi penuh, dan offset +07:00; teks inilah bentuk yang aman disimpan ke database atau dikirim lewat API.
  2. Parsing invariant: DateTimeOffset.Parse dengan culture invariant membaca teks kembali tanpa bergantung pengaturan mesin.
  3. Penampilan id-ID: nama bulan berubah menjadi Agustus, dan jam tampil 10.30 dengan pemisah titik, karena pada culture id-ID pemisah jam resminya adalah titik, bukan titik dua.