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.
| Specifier | Arti | Contoh untuk 2026-10-09 18:30:07.045 |
|---|---|---|
yyyy | Tahun, 4 digit | 2026 |
yy | Tahun, 2 digit | 26 |
MMMM | Nama bulan lengkap | October |
MMM | Nama bulan singkat | Oct |
MM | Bulan, 2 digit | 10 |
M | Bulan, 1 atau 2 digit | 10 |
dddd | Nama hari lengkap | Friday |
ddd | Nama hari singkat | Fri |
dd | Tanggal, 2 digit | 09 |
d | Tanggal, 1 atau 2 digit (di dalam pola) | 9 |
HH | Jam, 00 sampai 23 | 18 |
H | Jam, 0 sampai 23 | 18 |
hh | Jam, 01 sampai 12 | 06 |
h | Jam, 1 sampai 12 | 6 |
mm | Menit, 2 digit | 30 |
ss | Detik, 2 digit | 07 |
fff | Milidetik | 045 |
fffffff | Tick (tujuh digit pecahan) | 0450000 |
tt | Penanda AM/PM | PM |
zzz | Offset dari UTC (DateTimeOffset atau waktu lokal) | +02:00 |
K | Informasi zona: Z, sebuah offset, atau tidak ada | Z (untuk nilai UTC) |
/ | Pemisah tanggal milik culture | / atau . atau - |
: | Pemisah waktu milik culture | : |
'text' atau \c | Teks 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
| Kode | Nama | Bergantung pada culture? |
|---|---|---|
d / D | Tanggal pendek / panjang | Ya |
t / T | Waktu pendek / panjang | Ya |
f / F | Tanggal panjang dengan waktu pendek / panjang | Ya |
g / G | Tanggal pendek dengan waktu pendek / panjang | Ya |
M | Bulan dan tanggal | Ya |
Y | Tahun dan bulan | Ya |
o | Round-trip ISO 8601, 7 digit pecahan, zona | Tidak |
s | ISO 8601 sortable, tanpa pecahan, tanpa zona | Tidak |
u | Universal sortable, diakhiri Z | Tidak |
r | RFC 1123, untuk header HTTP | Tidak |
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
mmuntuk bulan."yyyy-mm-dd"mencetak menit di tengah:2026-30-09. Bulan adalahMM.hhtanpatt."hh:mm"adalah jam format 12 jam tanpa AM atau PM, jadi 06:30 menjadi ambigu. PakaiHHuntuk waktu format 24 jam.YYYYdanDD. Keduanya bukan specifier di .NET; keduanya dicetak apa adanya. Pakaiyyyydandd./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
ToStringmaupunParseExact.
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.