Cara Input Tanggal di PHP: Format, Validasi, dan Operasi Tanggal

mengolah tanggal dan waktu itu hal yang hampir selalu ketemu waktu bikin aplikasi php. mulai dari input tanggal di form, validasi format, hitung selisih hari, sampai menampilkan tanggal dalam format Indonesia, semuanya bisa dikerjakan pakai fungsi bawaan PHP.
di tutorial ini saya coba bahas lengkap cara input tanggal di php, mulai dari form HTML, validasi, konversi format, operasi aritmatika tanggal, sampai menyimpannya ke database MySQL.
dulu saya sering menulis kode tanggal pakai date() dan strtotime() secara asal-asalan, dan tidak jarang hasilnya meleset satu hari maju atau mundur. masalah itu hilang setelah saya mulai konsisten pakai class DateTime 🙂. artikel ini saya rangkum dari hal yang menurut saya paling penting dikuasai: format yang benar di form, validasi, dan penyimpanan ke database.
Fungsi Tanggal di PHP
php menyediakan beberapa fungsi dan class untuk mengolah tanggal:
| Fungsi/Class | Kegunaan |
|---|---|
date() | Memformat tanggal |
strtotime() | Mengkonversi string tanggal ke timestamp |
DateTime | Class modern untuk manipulasi tanggal |
DateInterval | Selisih antara dua tanggal |
DatePeriod | Rentang tanggal dengan interval tertentu |
Metode 1: Input Tanggal dengan HTML5 date
cara paling mudah pakai input type date dari HTML5:
<?php
$tanggal = '';
$pesan = '';
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$tanggal = $_POST['tanggal'] ?? '';
if (empty($tanggal)) {
$pesan = 'Tanggal harus diisi!';
} else {
// Format dari input date HTML: YYYY-MM-DD
$timestamp = strtotime($tanggal);
$format_indo = date('d F Y', $timestamp);
$pesan = "Tanggal yang dipilih: $format_indo";
}
}
?>
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<title>Input Tanggal HTML5</title>
<style>
body { font-family: Arial, sans-serif; max-width: 500px; margin: 50px auto; padding: 20px; }
.form-box { background: white; padding: 30px; border-radius: 12px; box-shadow: 0 2px 10px rgba(0,0,0,0.08); }
label { display: block; margin-bottom: 5px; font-weight: 600; }
input[type="date"] { width: 100%; padding: 10px; border: 1px solid #d1d5db; border-radius: 6px; font-size: 16px; margin-bottom: 15px; }
button { background: #3b82f6; color: white; padding: 10px 24px; border: none; border-radius: 6px; cursor: pointer; font-size: 15px; }
button:hover { background: #2563eb; }
.pesan { margin-top: 15px; padding: 12px; background: #f0fdf4; border-radius: 6px; color: #16a34a; }
</style>
</head>
<body>
<div class="form-box">
<h2>Input Tanggal</h2>
<form method="POST">
<label for="tanggal">Pilih Tanggal:</label>
<input type="date" name="tanggal" id="tanggal" value="<?= htmlspecialchars($tanggal) ?>"
min="2000-01-01" max="2030-12-31" required>
<button type="submit">Tampilkan</button>
</form>
<?php if ($pesan): ?>
<div class="pesan"><?= $pesan ?></div>
<?php endif; ?>
</div>
</body>
</html>
Metode 2: Input Tanggal dengan Dropdown (Select)
kalau kalian butuh kontrol lebih, pakai dropdown terpisah untuk hari, bulan, dan tahun:
<?php
$tanggal = '';
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$hari = (int)$_POST['hari'];
$bulan = (int)$_POST['bulan'];
$tahun = (int)$_POST['tahun'];
// Validasi tanggal
if (checkdate($bulan, $hari, $tahun)) {
$tanggal = sprintf('%04d-%02d-%02d', $tahun, $bulan, $hari);
echo "<div class='pesan'>Tanggal valid: " . date('d F Y', strtotime($tanggal)) . "</div>";
} else {
echo "<div class='pesan' style='background:#fef2f2;color:#dc2626;'>Tanggal tidak valid!</div>";
}
}
$nama_bulan = [
1 => 'Januari', 'Februari', 'Maret', 'April', 'Mei', 'Juni',
'Juli', 'Agustus', 'September', 'Oktober', 'November', 'Desember'
];
?>
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<title>Input Tanggal Dropdown</title>
<style>
body { font-family: Arial, sans-serif; max-width: 500px; margin: 50px auto; padding: 20px; }
.form-box { background: white; padding: 30px; border-radius: 12px; box-shadow: 0 2px 10px rgba(0,0,0,0.08); }
.date-group { display: flex; gap: 10px; margin-bottom: 15px; }
.date-group select { flex: 1; padding: 10px; border: 1px solid #d1d5db; border-radius: 6px; }
button { background: #3b82f6; color: white; padding: 10px 24px; border: none; border-radius: 6px; cursor: pointer; }
.pesan { margin-top: 15px; padding: 12px; background: #f0fdf4; border-radius: 6px; color: #16a34a; }
</style>
</head>
<body>
<div class="form-box">
<h2>Input Tanggal Lahir</h2>
<form method="POST">
<div class="date-group">
<select name="hari" required>
<option value="">Hari</option>
<?php for ($i = 1; $i <= 31; $i++): ?>
<option value="<?= $i ?>"><?= $i ?></option>
<?php endfor; ?>
</select>
<select name="bulan" required>
<option value="">Bulan</option>
<?php foreach ($nama_bulan as $num => $nama): ?>
<option value="<?= $num ?>"><?= $nama ?></option>
<?php endforeach; ?>
</select>
<select name="tahun" required>
<option value="">Tahun</option>
<?php for ($i = date('Y'); $i >= 1950; $i--): ?>
<option value="<?= $i ?>"><?= $i ?></option>
<?php endfor; ?>
</select>
</div>
<button type="submit">Validasi Tanggal</button>
</form>
</div>
</body>
</html>
penjelasannya:
checkdate($bulan, $hari, $tahun), fungsi php buat memvalidasi apakah tanggal valid, misalnya 31 Februari bakal ditolaksprintf('%04d-%02d-%02d'), dipakai memformat tanggal jadi format MySQL (YYYY-MM-DD)- dropdown tahun dimulai dari tahun sekarang mundur sampai 1950
Format Tanggal di PHP
berikut beberapa format tanggal yang bisa dipakai dengan fungsi date():
<?php
$sekarang = time();
// Format umum
echo date('Y-m-d', $sekarang); // 2026-07-28
echo date('d/m/Y', $sekarang); // 28/07/2026
echo date('d F Y', $sekarang); // 28 July 2026
echo date('l, d F Y', $sekarang); // Tuesday, 28 July 2026
echo date('d M Y H:i:s', $sekarang); // 28 Jul 2026 14:30:00
echo date('Y-m-d H:i:s', $sekarang); // 2026-07-28 14:30:00
// Kode format penting:
// d = hari (01-31)
// m = bulan angka (01-12)
// M = bulan singkat (Jan, Feb)
// F = bulan lengkap (January, February)
// Y = tahun 4 digit (2026)
// y = tahun 2 digit (26)
// H = jam 24 format (00-23)
// i = menit (00-59)
// s = detik (00-59)
// l = nama hari (Monday, Tuesday)
// D = nama hari singkat (Mon, Tue)
Format Tanggal Bahasa Indonesia
php default pakai bahasa Inggris. kalau mau format Indonesia, buat fungsi helper kayak gini:
<?php
function tanggalIndonesia($tanggal) {
$bulan = [
'January' => 'Januari', 'February' => 'Februari',
'March' => 'Maret', 'April' => 'April',
'May' => 'Mei', 'June' => 'Juni',
'July' => 'Juli', 'August' => 'Agustus',
'September' => 'September', 'October' => 'Oktober',
'November' => 'November', 'December' => 'Desember'
];
$hari = [
'Sunday' => 'Minggu', 'Monday' => 'Senin',
'Tuesday' => 'Selasa', 'Wednesday' => 'Rabu',
'Thursday' => 'Kamis', 'Friday' => 'Jumat',
'Saturday' => 'Sabtu'
];
$timestamp = is_numeric($tanggal) ? $tanggal : strtotime($tanggal);
$format = date('l, d F Y', $timestamp);
$format = str_replace(array_keys($hari), array_values($hari), $format);
$format = str_replace(array_keys($bulan), array_values($bulan), $format);
return $format;
}
// Contoh penggunaan
echo tanggalIndonesia('2026-07-28'); // Selasa, 28 Juli 2026
echo tanggalIndonesia('now'); // Hari ini
Menggunakan Class DateTime (Modern)
buat yang mau cara modern, class DateTime ini jawabannya buat ngolah tanggal di php:
<?php
// Membuat objek DateTime
$tanggal = new DateTime('2026-07-28');
$tanggal_sekarang = new DateTime(); // tanggal sekarang
// Memformat
echo $tanggal->format('d/m/Y'); // 28/07/2026
echo $tanggal->format('d F Y'); // 28 July 2026
// Menambah tanggal
$tanggal->modify('+7 days');
echo $tanggal->format('d/m/Y'); // 04/08/2026
// Mengurangi tanggal
$tanggal->modify('-1 month');
echo $tanggal->format('d/m/Y'); // 04/07/2026
// Menghitung selisih dua tanggal
$tanggal1 = new DateTime('2026-01-01');
$tanggal2 = new DateTime('2026-07-28');
$selisih = $tanggal1->diff($tanggal2);
echo $selisih->days . ' hari'; // 208 hari
echo $selisih->m . ' bulan ' . $selisih->d . ' hari'; // 6 bulan 27 hari
// Membandingkan tanggal
if ($tanggal1 < $tanggal2) {
echo 'Tanggal 1 lebih awal';
}
Menghitung Selisih Tanggal
buat hitung selisih tanggal ada beberapa cara, dari yang paling simpel sampai yang pakai object:
<?php
// Cara 1: Menggunakan DateTime
function hitungSelisihHari($tanggal1, $tanggal2) {
$t1 = new DateTime($tanggal1);
$t2 = new DateTime($tanggal2);
$selisih = $t1->diff($t2);
return $selisih->days;
}
echo hitungSelisihHari('2026-01-01', '2026-07-28'); // 208 hari
// Cara 2: Menggunakan strtotime
function hitungSelisihHariSimple($tanggal1, $tanggal2) {
$t1 = strtotime($tanggal1);
$t2 = strtotime($tanggal2);
$selisih = abs($t2 - $t1);
return floor($selisih / (60 * 60 * 24));
}
echo hitungSelisihHariSimple('2026-01-01', '2026-07-28'); // 208 hari
// Menghitung umur
function hitungUmur($tanggal_lahir) {
$lahir = new DateTime($tanggal_lahir);
$sekarang = new DateTime();
$umur = $sekarang->diff($lahir);
return $umur->y . ' tahun ' . $umur->m . ' bulan ' . $umur->d . ' hari';
}
echo hitungUmur('1995-03-15'); // 31 tahun 4 bulan 13 hari
Menyimpan Tanggal ke MySQL
<?php
require_once 'config/database.php';
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$tanggal_input = $_POST['tanggal']; // Format dari HTML: YYYY-MM-DD
$tanggal_mysql = date('Y-m-d', strtotime($tanggal_input));
// Simpan ke database
$stmt = $pdo->prepare('INSERT INTO events (judul, tanggal_event) VALUES (?, ?)');
$stmt->execute(['Event Baru', $tanggal_mysql]);
echo 'Data berhasil disimpan!';
}
// Mengambil tanggal dari database dan format ke Indonesia
$stmt = $pdo->query('SELECT judul, tanggal_event FROM events ORDER BY tanggal_event DESC');
$events = $stmt->fetchAll();
foreach ($events as $event) {
echo $event['judul'] . ' - ' . tanggalIndonesia($event['tanggal_event']);
}
Query MySQL dengan Filter Tanggal
selain menyimpan, seringnya kita juga butuh mencari data berdasarkan tanggal. ini contoh query yang umum dipakai:
-- Data hari ini
SELECT * FROM events WHERE DATE(tanggal_event) = CURDATE();
-- Data minggu ini
SELECT * FROM events WHERE WEEK(tanggal_event) = WEEK(CURDATE());
-- Data bulan ini
SELECT * FROM events WHERE MONTH(tanggal_event) = MONTH(CURDATE())
AND YEAR(tanggal_event) = YEAR(CURDATE());
-- Data antara dua tanggal
SELECT * FROM events WHERE tanggal_event BETWEEN '2026-01-01' AND '2026-06-30';
-- Data 7 hari terakhir
SELECT * FROM events WHERE tanggal_event >= DATE_SUB(CURDATE(), INTERVAL 7 DAY);
Validasi Tanggal di PHP
<?php
function validasiTanggal($tanggal, $format = 'Y-m-d') {
$d = DateTime::createFromFormat($format, $tanggal);
return $d && $d->format($format) === $tanggal;
}
// Test
var_dump(validasiTanggal('2026-07-28')); // true
var_dump(validasiTanggal('2026-02-30')); // false (30 Feb tidak ada)
var_dump(validasiTanggal('28/07/2026', 'd/m/Y')); // true
var_dump(validasiTanggal('31/02/2026', 'd/m/Y')); // false
Praktik Terbaik
beberapa tips yang selalu saya terapkan waktu nulis kode php:
- pakai prepared statement dengan PDO atau MySQLi biar aman dari SQL injection, jangan concatenate query secara langsung
- selalu validasi dan sanitasi data dari user, bisa pakai
filter_var(),htmlspecialchars(), atau library validasi - waktu development, aktifkan
error_reporting(E_ALL)dandisplay_errorsbiar gampang nyari bug - rapiin file file class pakai Composer autoload atau PSR-4 biar kegampang diolah otomatis
- pisahkan logic dan view, mau pakai pola MVC atau minimal pisahin kode php dan html biar rapi dan gampang dipelihara
kalau aturan-aturan di atas diterapkan, kode php kalian jadi lebih aman dan gampang dirawat, bukan cuma soal tanggal aja.
- Fungsi
any()pada Python: Menyederhanakan Evaluasi Keberadaan Data - Cara Membuat Search Engine dengan PHP dan MySQL
- Fungsi Struktur Percabangan pada Bahasa Python
Kesimpulan
cara input tanggal di php sebenernya ada beberapa metode, tinggal pilih yang cocok sama kebutuhan:
- HTML5 date input, paling mudah, formatnya langsung YYYY-MM-DD
- dropdown terpisah, kontrol lebih, validasi pakai
checkdate() - class DateTime, cara modern dan lebih fleksibel buat operasi tanggal
- fungsi
date(), buat memformat tanggal
untuk format bahasa Indonesia, tinggal buat fungsi helper yang mengubah nama bulan dan hari dari Inggris ke Indonesia. kalau mau menyimpan ke MySQL, pakai format YYYY-MM-DD.
Pertanyaan yang Sering Diajukan
Bagaimana cara input tanggal di PHP?
Cara paling mudah pakai input type date dari HTML5 yang hasilnya langsung format YYYY-MM-DD, atau pakai dropdown terpisah untuk hari, bulan, dan tahun.
Bagaimana cara validasi tanggal di PHP?
Gunakan checkdate() untuk memvalidasi kombinasi hari, bulan, dan tahun, atau DateTime::createFromFormat() kalau formatnya juga perlu dicek.
Format tanggal apa yang harus dipakai untuk MySQL?
MySQL menyimpan tanggal dalam format YYYY-MM-DD, jadi pastikan nilai dari form dikonversi dulu ke format ini sebelum disimpan.
Bagaimana cara menampilkan tanggal dalam bahasa Indonesia di PHP?
PHP default memakai bahasa Inggris. Buat fungsi helper yang menerjemahkan nama hari dan bulan dengan str_replace agar hasilnya bahasa Indonesia.

