Date: Format & Manipulasi
Bekerja dengan tanggal seperti profesional: format lokal Indonesia dengan toLocaleDateString, tambah/kurang hari dengan setDate, hitung selisih waktu dalam milidetik, plus jebakan parsing string dan zona waktu.
Kenapa Tanggal Itu Menyebalkan?
Tanggal rumit karena format beda negara (08/09: Agustus atau September?), bulan yang dihitung dari 0, dan zona waktu. Objek Date plus method format berbasis locale menyelesaikan tiga operasi paling sering: menampilkan, menggeser, dan mengukur selisih.
Membuat Date
new Date(); // sekarang
new Date(2026, 9, 8); // 8 Oktober 2026 (bulan 9 = Oktober! 0-11)
new Date(2026, 9, 8, 14, 30); // 8 Okt 2026 jam 14:30
Date.now(); // timestamp milidetik sekarang (number)Ingat: bulan dihitung dari 0, tanggal dari 1. Sumber bug klasik.
Format Indonesia dengan toLocaleDateString
Cara termudah menampilkan tanggal ramah manusia:
const d = new Date(2026, 9, 8);
d.toLocaleDateString("id-ID", {
weekday: "long", // "Kamis"
year: "numeric", // 2026
month: "long", // "Oktober"
day: "numeric", // 8
});
// "Kamis, 8 Oktober 2026"Variasikan opsinya sesuai kebutuhan:
const d = new Date(2026, 9, 8);
d.toLocaleDateString("id-ID"); // "8/10/2026" (default pendek)
d.toLocaleDateString("id-ID", { dateStyle: "full" }); // "Kamis, 8 Oktober 2026"
d.toLocaleDateString("id-ID", { dateStyle: "medium" }); // "8 Okt 2026"Contoh realistis: daftar jadwal dengan format konsisten.
const jadwal = [
{ acara: "Gladi bersih TKA", tanggal: new Date(2026, 9, 12) },
{ acara: "Ujian TKA", tanggal: new Date(2026, 9, 26) },
];
jadwal.forEach(j => {
const tgl = j.tanggal.toLocaleDateString("id-ID", { dateStyle: "full" });
console.log(`${j.acara}: ${tgl}`);
});
// Gladi bersih TKA: Senin, 12 Oktober 2026
// Ujian TKA: Senin, 26 Oktober 2026Manipulasi: Geser Hari, Jam, Menit
setDate (dan setHours, setMinutes, setMonth) otomatis menangani ganti bulan/tahun, jauh lebih aman daripada aritmatika manual.
const besok = new Date();
besok.setDate(besok.getDate() + 1);
const mingguLalu = new Date();
mingguLalu.setDate(mingguLalu.getDate() - 7);
const akhirBulan = new Date(2026, 9, 31); // 31 Okt + 1 hari
akhirBulan.setDate(akhirBulan.getDate() + 1);
console.log(akhirBulan.toLocaleDateString("id-ID")); // otomatis jadi 1 November!Contoh realistis: hitung tanggal jatuh tempo 14 hari dari sekarang, lewati akhir pekan.
function jatuhTempo(hariKerja = 14) {
const tgl = new Date();
let ditambah = 0;
while (ditambah < hariKerja) {
tgl.setDate(tgl.getDate() + 1);
const hari = tgl.getDay(); // 0 = Minggu, 6 = Sabtu
if (hari !== 0 && hari !== 6) ditambah++;
}
return tgl;
}
console.log(jatuhTempo().toLocaleDateString("id-ID", { dateStyle: "full" }));Selisih Waktu: Kurangi Saja
Pengurangan dua Date menghasilkan MILIDETIK; bagi dengan konstanta waktu:
const a = new Date(2026, 9, 1);
const b = new Date(2026, 9, 8);
const selisihHari = (b - a) / (1000 * 60 * 60 * 24);
console.log(selisihHari); // 7Contoh realistis: hitung mundur plus label ramah ("3 hari lagi", "terlambat 2 hari").
function statusTenggat(tenggat) {
const sisaHari = Math.ceil((tenggat - Date.now()) / (1000 * 60 * 60 * 24));
if (sisaHari < 0) return `Terlambat ${-sisaHari} hari!`;
if (sisaHari === 0) return "Hari ini tenggatnya!";
return `Sisa ${sisaHari} hari`;
}
console.log(statusTenggat(new Date(2026, 9, 26)));Math.ceil membuat sisa 2,1 hari terbaca "3 hari" (masih 3 hari kalender).
Jebakan Umum
- Bulan 0-11:
new Date(2026, 9, 8)adalah Oktober. Ingat saat hardcode. - Parsing string ambigu:
new Date("08/09/2026")dibaca MM/DD/YYYY (9 Agustus!), bukan DD/MM. Aman: format ISOnew Date("2026-09-08")atau konstruktor numerik. - Zona waktu:
new Date("2026-10-08")dianggap UTC tengah malam, bisa jadi tanggal 7 di WIB. Untuk tanggal kalender,new Date(2026, 9, 8)memakai zona lokal. - Membandingkan Date dengan
===: dua objek Date tidak pernah sama meski waktunya identik. Bandingkan dengangetTime()atau kurangi langsung. - Untuk kebutuhan kompleks (zona waktu, kalender non-Gregorian, durasi), jangan tulis manual: pakai library seperti date-fns atau dayjs.
Ringkasan
Format dengan toLocaleDateString("id-ID", {...}), geser dengan setDate(getDate() ± n), ukur selisih via pengurangan (milidetik). Waspadai: bulan dari 0, parsing ambigu, zona waktu.
export default function App(): JSX.Element { return <h1>Hello world</h1> }
Tantangan
Hitung Mundur
Diberi tanggal ujian new Date(2026, 9, 26). Hitung sisa hari dari SEKARANG (bulatkan ke atas dengan Math.ceil), tampilkan "Sisa N hari menuju ujian". Hitung mundur tenggat adalah fitur nyata di aplikasi belajar, event organizer, dan e-commerce (flash sale): pola selisih-tanggal-dibagi-konstanta-waktu ini dipakai berulang-ulang.
<!doctype html> <html> <head> <meta charset="utf-8" /> </head> <body> <h1>Halo JS</h1> <p>Buka console preview untuk melihat output.</p> <script src="index.js"></script> </body> </html>