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

| | PHP
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/ClassKegunaan
date()Memformat tanggal
strtotime()Mengkonversi string tanggal ke timestamp
DateTimeClass modern untuk manipulasi tanggal
DateIntervalSelisih antara dua tanggal
DatePeriodRentang 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 ditolak
  • sprintf('%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:

  1. pakai prepared statement dengan PDO atau MySQLi biar aman dari SQL injection, jangan concatenate query secara langsung
  2. selalu validasi dan sanitasi data dari user, bisa pakai filter_var(), htmlspecialchars(), atau library validasi
  3. waktu development, aktifkan error_reporting(E_ALL) dan display_errors biar gampang nyari bug
  4. rapiin file file class pakai Composer autoload atau PSR-4 biar kegampang diolah otomatis
  5. 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.

Kesimpulan

cara input tanggal di php sebenernya ada beberapa metode, tinggal pilih yang cocok sama kebutuhan:

  1. HTML5 date input, paling mudah, formatnya langsung YYYY-MM-DD
  2. dropdown terpisah, kontrol lebih, validasi pakai checkdate()
  3. class DateTime, cara modern dan lebih fleksibel buat operasi tanggal
  4. 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.

Sigit Nurhanafi avatar
Full-stack developer & technical writer. Berpengalaman di PHP, Laravel, NodeJS, MySQL, dan Python. Aktif menulis tutorial pemrograman dan maintaining open-source projects di PemburuKode sejak 2021.