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.InvariantCultureuntuk format dan parsing data mesin ke mesin. - Berikan
CultureInfopengguna 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.30Mari kita bedah kedua baris keluaran:
- 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. - Parsing invariant:
DateTimeOffset.Parsedengan culture invariant membaca teks kembali tanpa bergantung pengaturan mesin. - Penampilan id-ID: nama bulan berubah menjadi
Agustus, dan jam tampil10.30dengan pemisah titik, karena pada culture id-ID pemisah jam resminya adalah titik, bukan titik dua.