date('Y-m-d') mengembalikan tanggal hari ini sebagai string, misalnya 2026-03-14. Argumen pertama adalah string format, dan setiap hurufnya mewakili bagian dari tanggal (Y tahun, m bulan, d hari, H:i:s jam), sedangkan argumen kedua yang opsional adalah Unix timestamp yang diformat sebagai ganti waktu saat ini.
Output-nya berubah setiap kali kamu menekan Jalankan, karena isinya tanggal dan jam saat ini dalam UTC. Setiap huruf string format, dan cara menaruh teks biasa di antaranya, ada di halaman format tanggal PHP.
Timestamp: time(), mktime(), dan strtotime()
Unix timestamp adalah jumlah detik sejak 1 Januari 1970 tengah malam UTC. time() mengembalikan timestamp saat ini, mktime(hour, minute, second, month, day, year) membuatnya dari bagian-bagian tanggal, dan strtotime() membaca tanggal yang ditulis dalam bahasa Inggris ('2026-03-14', '+1 week', 'next monday'). Berikan timestamp apa pun sebagai argumen kedua date(). Argumen kedua strtotime() adalah titik waktu yang menjadi acuan frasa relatif; tanpa argumen itu, hitungannya dimulai dari sekarang.
Output:
1773480600
Sat, 14 Mar 2026 09:30
2027-01-01
tomorrow Sun 2026-03-15
+1 week Sat 2026-03-21
next monday Mon 2026-03-16
last day of this month Tue 2026-03-31
first monday of next month Mon 2026-04-06
bool(false)
Perilaku melimpah di mktime() ini berguna: hari ke-0 dari suatu bulan adalah hari terakhir bulan sebelumnya, jadi mktime(0, 0, 0, 3, 0, 2026) adalah 28 Februari. Selalu bandingkan hasilnya dengan false sebelum dipakai lebih lanjut: date('Y-m-d', false) diam-diam mencetak 1970-01-01, tanggal yang tidak dimaksud siapa pun.
Menambah hari pada tanggal
Untuk apa pun selain sekadar mencetak, pakai DateTimeImmutable. Method modify()-nya menerima frasa yang sama dengan strtotime() dan mengembalikan tanggal baru, sedangkan add() menerima DateInterval seperti P7D (periode 7 hari) atau PT90M (90 menit).
Output:
2026-03-21
2026-03-13
2026-04-14
11:00
2025-03-14
2026-03-03
2026-02-28
31 Februari tidak ada, jadi +1 month pada 31 Januari jatuh di 3 Maret. Kalau yang kamu maksud "akhir bulan depan", tulis dengan jelas: last day of next month.
DateTime vs DateTimeImmutable
DateTime mengubah dirinya sendiri saat kamu memanggil modify(), add(), atau setDate(), lalu mengembalikan objek yang sama. Ini mengejutkan orang yang menyimpan tanggal aslinya di sebuah variabel:
Output:
2026-03-21
2026-03-21
bool(true)
2026-03-14
2026-03-21
Pilih DateTimeImmutable di kode baru. Kedua class punya method yang sama dan sama-sama mengimplementasikan DateTimeInterface, jadi sebuah fungsi bisa menerima keduanya.
Selisih dua tanggal
diff() mengembalikan DateInterval. Property days-nya adalah total jumlah hari di antara kedua tanggal, sedangkan y, m, dan d membagi jaraknya menjadi tahun, bulan, dan hari, persis yang dibutuhkan untuk menghitung umur. Ubah tanggalnya lalu jalankan lagi:
Output:
Age: 35
Exactly: 35 years, 7 months, 22 days
Days alive: 13021
286 days to go
9 months and 11 days
-286 days
Di format(), %a adalah total hari dan %d hanya bagian harinya, jadi %a yang dipakai untuk "berapa hari lagi". Untuk membandingkan dua tanggal tanpa menghitung selisih, operator biasa bisa dipakai pada objek tanggal: $today < $christmas bernilai true.
Zona waktu
date() dan new DateTimeImmutable() memakai zona waktu bawaan, yang berasal dari date.timezone di php.ini (UTC kalau tidak diatur). Atur untuk seluruh script dengan date_default_timezone_set(), atau beri satu tanggal DateTimeZone-nya sendiri dan konversi dengan setTimezone():
Output:
Asia/Tokyo 2026-03-14 18:30 JST +09:00
Europe/Berlin 2026-03-14 10:30 CET +01:00
America/New_York 2026-03-14 05:30 EDT -04:00
Asia/Tokyo
2026-03-14 18:30
Timestamp adalah angka yang sama di mana pun; zona waktu hanya mengubah cara penulisannya. Karena itulah saran yang umum adalah menyimpan tanggal dalam UTC dan mengonversinya saat ditampilkan.
Menampilkan kalender di halaman web
Tanggal paling sering dicetak ke dalam HTML. Blok ini menggambar bulan saat ini sebagai kalender dan menandai hari ini. Jalankan, lalu klik Previous atau Next: script yang sama berjalan lagi dengan $_GET['m'] yang diisi dari link tersebut, misalnya ?m=2026-04.
format('N') memberi hari dalam minggu sebagai 1 (Senin) sampai 7 (Minggu), yang menentukan berapa sel kosong sebelum tanggal 1, dan format('t') memberi jumlah hari dalam bulan itu. Tanda ! di '!Y-m' mengatur ulang setiap field yang tidak disebut format, jadi harinya tanggal 1 dan jamnya tengah malam.
Kesalahan umum dengan date()
Argumen kedua date() harus berupa timestamp, bukan string tanggal. Baris ini:
<?php
echo date('d/m/Y', '2026-03-14');
menghentikan script dengan TypeError:
PHP Fatal error: Uncaught TypeError: date(): Argument #2 ($timestamp) must be of type ?int, string given in /home/index.php:2
Konversi dulu string-nya, dengan strtotime() atau sebuah objek:
Output:
14/03/2026
14/03/2026
bool(false)
bool(true)
Dua lagi yang perlu diwaspadai: m adalah bulan dan i adalah menit, jadi 'H:m' mencetak bulan di tempat yang seharusnya menit; dan new DateTimeImmutable('garbage') melempar exception alih-alih mengembalikan false, jadi bungkus input pengguna dengan try/catch atau parse dengan DateTimeImmutable::createFromFormat(), yang mengembalikan false kalau tidak cocok.
Pertanyaan yang sering diajukan
Bagaimana cara mendapatkan tanggal saat ini di PHP?
Panggil date() dengan string format: echo date('Y-m-d'); mencetak tanggal hari ini seperti 2026-03-14, dan date('Y-m-d H:i:s') menambahkan jamnya. Versi objeknya adalah (new DateTimeImmutable())->format('Y-m-d').
Bagaimana cara menambah hari pada tanggal di PHP?
Pakai modify() pada DateTimeImmutable: (new DateTimeImmutable('2026-03-14'))->modify('+7 days')->format('Y-m-d') menghasilkan 2026-03-21. Dengan timestamp, date('Y-m-d', strtotime('+7 days', $timestamp)) melakukan hal yang sama.
Bagaimana cara menghitung selisih dua tanggal di PHP?
Panggil diff() pada satu tanggal dengan tanggal yang lain: $a->diff($b) mengembalikan DateInterval. Property days-nya adalah total jumlah hari, sedangkan y, m, d berisi tahun, bulan, dan hari. Begitulah cara menghitung umur seseorang.
Bagaimana cara mengubah Unix timestamp menjadi tanggal di PHP?
Berikan sebagai argumen kedua date(): date('Y-m-d H:i:s', 1773479107) mengembalikan 2026-03-14 09:05:07 dalam UTC. Untuk objek, pakai new DateTimeImmutable('@1773479107').
Kenapa date() di PHP menampilkan jam yang salah?
date() memakai zona waktu bawaan, yang berasal dari date.timezone di php.ini dan sering kali UTC. Atur zona waktumu sendiri dengan date_default_timezone_set('Europe/Berlin') di bagian atas script, atau berikan DateTimeZone ke DateTimeImmutable.