Menu

Format DateTime C#: Format String Standar dan Custom, Culture, ISO 8601

Cara memformat DateTime menjadi string di C#: format string standar (d, D, o, s, u, t), pola custom seperti yyyy-MM-dd HH:mm:ss, tabel specifier lengkap, cara culture mengubah output, round-trip ISO 8601 dengan "o", dan kesalahan mm vs MM serta hh vs HH.

Halaman ini dilengkapi editor yang bisa dijalankan. Edit, jalankan, dan lihat output-nya seketika.

DateTime.ToString(format) mengubah tanggal menjadi teks. Format-nya bisa berupa format string standar (satu huruf seperti d atau o, yang pola pastinya berasal dari culture) atau pola custom yang disusun dari specifier seperti yyyy, MM, dan HH. String yang sama juga berlaku di interpolasi, $"{date:yyyy-MM-dd}", dan di string.Format.

Output:

2026-10-09
2026-10-09 18:30:07
09/10/2026
Oct 9, 2026
Friday, October 9
6:30 PM
18:30:07.045
Shipped 2026-10-09 at 18:30

Contoh di halaman ini memberikan CultureInfo.InvariantCulture supaya output-nya sama di setiap mesin; tanpa itu, ToString memakai culture saat ini, yang bisa mengubah nama bulan, pemisah, bahkan kalendernya.

Specifier format custom

Format custom adalah pola yang huruf-huruf tertentunya mewakili bagian dari tanggal. Huruf-huruf ini peka huruf besar-kecil: M adalah bulan dan m adalah menit, H adalah jam format 24 jam dan h jam format 12 jam.

SpecifierArtiContoh untuk 2026-10-09 18:30:07.045
yyyyTahun, 4 digit2026
yyTahun, 2 digit26
MMMMNama bulan lengkapOctober
MMMNama bulan singkatOct
MMBulan, 2 digit10
MBulan, 1 atau 2 digit10
ddddNama hari lengkapFriday
dddNama hari singkatFri
ddTanggal, 2 digit09
dTanggal, 1 atau 2 digit (di dalam pola)9
HHJam, 00 sampai 2318
HJam, 0 sampai 2318
hhJam, 01 sampai 1206
hJam, 1 sampai 126
mmMenit, 2 digit30
ssDetik, 2 digit07
fffMilidetik045
fffffffTick (tujuh digit pecahan)0450000
ttPenanda AM/PMPM
zzzOffset dari UTC (DateTimeOffset atau waktu lokal)+02:00
KInformasi zona: Z, sebuah offset, atau tidak adaZ (untuk nilai UTC)
/Pemisah tanggal milik culture/ atau . atau -
:Pemisah waktu milik culture:
'text' atau \cTeks atau karakter literal'at'

Karakter lain disalin apa adanya. Termasuk huruf yang bukan specifier, dan begitulah "YYYY-DD" diam-diam mencetak YYYY-DD: tidak ada specifier Y atau D huruf besar di .NET.

Satu huruf yang berdiri sendiri dibaca sebagai format standar, bukan custom: ToString("d") adalah pola tanggal pendek, bukan nomor tanggal. Untuk mendapat tanggalnya saja, tulis ToString("%d") atau pakai property Day.

Output:

10/09/2026
9
20261009_183007
Week of Oct 9
18h30
2026-10-09T18:30:07
YYYY-DD

Format string standar

Format standar adalah huruf tunggal yang pola sebenarnya ditentukan oleh culture. Format ini pilihan yang tepat untuk teks yang ditampilkan ke pengguna, karena setiap culture otomatis mendapat konvensinya sendiri.

Output:

d  10/09/2026
D  Friday, 09 October 2026
f  Friday, 09 October 2026 18:30
g  10/09/2026 18:30
G  10/09/2026 18:30:07
M  October 09
Y  2026 October
t  18:30
T  18:30:07
o  2026-10-09T18:30:07.0000000Z
s  2026-10-09T18:30:07
u  2026-10-09 18:30:07Z
r  Fri, 09 Oct 2026 18:30:07 GMT
en-US d: 10/9/2026, D: Friday, October 9, 2026
KodeNamaBergantung pada culture?
d / DTanggal pendek / panjangYa
t / TWaktu pendek / panjangYa
f / FTanggal panjang dengan waktu pendek / panjangYa
g / GTanggal pendek dengan waktu pendek / panjangYa
MBulan dan tanggalYa
YTahun dan bulanYa
oRound-trip ISO 8601, 7 digit pecahan, zonaTidak
sISO 8601 sortable, tanpa pecahan, tanpa zonaTidak
uUniversal sortable, diakhiri ZTidak
rRFC 1123, untuk header HTTPTidak

o, s, u, dan r menghasilkan teks yang sama di setiap culture, jadi aman untuk log, nama file, dan pertukaran data. Perhatikan bahwa pada DateTime, u dan r tidak mengonversi nilainya ke UTC; keduanya mencetak nilai apa adanya dan memberinya label UTC, jadi panggil ToUniversalTime() dulu (atau pakai DateTime.UtcNow) kalau nilainya waktu lokal. (Pada DateTimeOffset, keduanya memang mengonversi.)

Culture mengubah output

Format standar, nama bulan dan hari, serta pemisah / dan : semuanya berasal dari culture. Berikan culture sebagai argumen kedua ke ToString:

Output:

en-US  10/9/2026
en-GB  09/10/2026
de-DE  09.10.2026
fr-FR  09/10/2026
ja-JP  2026/10/09
Freitag, 9. Oktober 2026
vendredi 9 octobre 2026
09.10.2026
09/10/2026

Data culture tidak beku. .NET di Linux dan macOS membacanya dari library ICU yang terpasang di sistem, dan sejak .NET 5 begitu juga .NET di Windows 10 ke atas (.NET Framework memakai data NLS milik Windows sendiri), jadi sebuah pola bisa sedikit berubah antarversi dan antarplatform: misalnya, rilis ICU terbaru menaruh narrow no-break space, bukan spasi biasa, sebelum "PM" di format waktu pendek AS, dan sebagian memberi tanggal pendek bahasa Spanyol tanpa nol di depan. Itu satu alasan lagi untuk tidak pernah mem-parse teks yang diformat untuk tampilan.

Ada dua aturan yang mengikutinya. Untuk teks yang dibaca manusia, format dengan culture mereka (di server, culture dari request, bukan culture server) dan utamakan format standar, supaya pembaca Jerman melihat 09.10.2026 dan pembaca Amerika 10/9/2026. Untuk teks yang dibaca program, pakai CultureInfo.InvariantCulture dan pola yang tidak ambigu seperti yyyy-MM-dd atau o. Tanggal yang ditulis dengan culture saat ini lalu di-parse di mesin lain adalah sumber klasik tertukarnya tanggal dan bulan.

ISO 8601 dan round-trip dengan "o"

Format round-trip "o" menulis setiap tick ditambah informasi zona, jadi mem-parse teksnya mengembalikan DateTime yang persis sama, termasuk Kind-nya:

Output:

2026-10-09T18:30:07.0450000Z
2026-10-09T18:30:07.0450000
2026-10-09T20:30:07.0000000+02:00
True
Utc
2026-10-09T18:30:07Z
2026-10-09 20:30 +02:00

Suffix Z menandai UTC; DateTime dengan Kind Unspecified tidak mendapat suffix; waktu lokal atau DateTimeOffset mendapat offset-nya (+02:00). Parse dengan DateTimeStyles.RoundtripKind supaya Kind-nya tetap terjaga. Serializer JSON, database, dan Date milik JavaScript semuanya bisa membaca format ini.

Memformat TimeSpan

TimeSpan punya sekumpulan specifier custom sendiri yang lebih kecil: d (hari), hh, mm, ss, dan fff. Berbeda dengan DateTime, setiap karakter literal, termasuk : dan ., harus di-escape dengan backslash atau diberi tanda kutip:

Output:

1.03:25:09.1200000
1.03:25:09.1200000
03:25:09
1.03:25
25:09.120
27:25

hh di format TimeSpan adalah komponen jam (0 sampai 23), jadi durasi 27 jam dicetak sebagai 03. Untuk total di atas satu hari, hitung dari TotalHours seperti di baris terakhir. elapsed.ToString("hh:mm") tanpa backslash melempar FormatException.

Kesalahan umum

  • mm untuk bulan. "yyyy-mm-dd" mencetak menit di tengah: 2026-30-09. Bulan adalah MM.
  • hh tanpa tt. "hh:mm" adalah jam format 12 jam tanpa AM atau PM, jadi 06:30 menjadi ambigu. Pakai HH untuk waktu format 24 jam.
  • YYYY dan DD. Keduanya bukan specifier di .NET; keduanya dicetak apa adanya. Pakai yyyy dan dd.
  • / di dalam pola untuk data. Karakter ini adalah pemisah tanggal milik culture. Beri tanda kutip atau pakai invariant culture.
  • ToString() default di log atau file. Format-nya bergantung pada mesin. Berikan format dan culture.
  • Waktu lokal yang diberi label UTC. "u", "r", dan 'Z' yang ditulis manual tidak mengonversi; konversi dulu.
  • Mem-parse dengan pola yang berbeda dari pola saat menulis. Simpan format string untuk data di satu konstanta dan pakai untuk ToString maupun ParseExact.

Pertanyaan yang sering diajukan

Bagaimana cara memformat DateTime menjadi yyyy-MM-dd di C#?

date.ToString("yyyy-MM-dd") menghasilkan 2026-10-09. Di dalam interpolated string, tulis $"{date:yyyy-MM-dd}". Tambahkan " HH:mm:ss" untuk jam dalam format 24 jam. Berikan CultureInfo.InvariantCulture sebagai argumen kedua saat teksnya untuk file atau program lain, supaya kalender, nama bulan, dan pemisahnya tidak pernah bergantung pada mesin.

Apa bedanya mm dan MM di format tanggal C#?

MM adalah bulan (01 sampai 12) dan mm adalah menit (00 sampai 59). Format-nya peka huruf besar-kecil, jadi yyyy-mm-dd mencetak menit di tempat yang seharusnya bulan, bug yang mudah terlewat kalau kamu hanya melirik satu nilai. Begitu juga HH adalah jam format 24 jam dan hh jam format 12 jam.

Bagaimana cara memformat DateTime dalam ISO 8601 di C#?

Pakai format round-trip "o": DateTime.UtcNow.ToString("o") menghasilkan 2026-10-09T18:30:07.0450000Z, dengan tujuh digit pecahan dan Z untuk UTC atau sebuah offset untuk waktu lokal. "s" memberi bentuk sortable yang lebih pendek tanpa pecahan atau zona, dan "yyyy-MM-ddTHH:mm:ssZ" adalah varian custom yang umum.

Bagaimana cara menampilkan AM dan PM di format tanggal C#?

Pakai hh atau h untuk jam format 12 jam dan tt untuk penanda AM/PM: date.ToString("h:mm tt", CultureInfo.GetCultureInfo("en-US")) menghasilkan 6:30 PM. Penandanya berasal dari culture, dan sebagian culture tidak punya penanda itu, jadi berikan culture secara eksplisit saat kamu butuh AM dan PM.

Kenapa format tanggal saya menampilkan titik, bukan garis miring?

Di format string, / bukan garis miring literal, melainkan pemisah tanggal milik culture, dan : adalah pemisah waktu milik culture. Di mesin berbahasa Jerman, dd/MM/yyyy mencetak 09.10.2026. Beri tanda kutip pada karakternya untuk memaksanya, dd'/'MM'/'yyyy, atau format dengan CultureInfo.InvariantCulture.

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai