Tanggal dan Waktu di PHP

Pelajari cara mengelola tanggal dan waktu di PHP dengan berbagai fungsi built-in dan DateTime class. Sangat penting untuk aplikasi yang menangani data temporal.

Fungsi Tanggal Dasar

PHP menyediakan berbagai fungsi untuk menangani tanggal dan waktu. Fungsi date() adalah yang paling sering digunakan.

Fungsi date()

<?php
// Format dasar
echo date('Y-m-d'); // 2024-01-15
echo date('d/m/Y'); // 15/01/2024
echo date('F j, Y'); // January 15, 2024

// Dengan waktu
echo date('Y-m-d H:i:s'); // 2024-01-15 14:30:25
echo date('h:i A'); // 02:30 PM

// Hari dan bulan
echo date('l'); // Monday
echo date('F'); // January
echo date('D, M j'); // Mon, Jan 15
?>

Format Karakter Penting

Karakter Deskripsi Contoh
Y Tahun 4 digit 2024
y Tahun 2 digit 24
m Bulan dengan leading zero 01-12
n Bulan tanpa leading zero 1-12
d Tanggal dengan leading zero 01-31
j Tanggal tanpa leading zero 1-31
H Jam 24 format 00-23
h Jam 12 format 01-12
i Menit 00-59
s Detik 00-59

Fungsi time() dan mktime()

<?php
// Timestamp saat ini
$now = time();
echo $now; // 1705320625

// Membuat timestamp dari tanggal tertentu
$timestamp = mktime(14, 30, 0, 1, 15, 2024); // jam, menit, detik, bulan, tanggal, tahun
echo date('Y-m-d H:i:s', $timestamp);

// Menggunakan timestamp dalam date()
echo date('Y-m-d', $now);

// Timestamp kemarin
$yesterday = time() - (24 * 60 * 60);
echo date('Y-m-d', $yesterday);
?>
Tips: Timestamp adalah jumlah detik sejak 1 Januari 1970 (Unix Epoch). Sangat berguna untuk kalkulasi dan penyimpanan database.

DateTime Class

DateTime class memberikan cara yang lebih modern dan powerful untuk menangani tanggal dan waktu di PHP.

Membuat DateTime Object

<?php
// DateTime sekarang
$now = new DateTime();
echo $now->format('Y-m-d H:i:s');

// DateTime dari string
$date1 = new DateTime('2024-01-15');
$date2 = new DateTime('2024-01-15 14:30:00');
$date3 = new DateTime('next Monday');
$date4 = new DateTime('+1 week');

echo $date1->format('Y-m-d'); // 2024-01-15
echo $date3->format('Y-m-d'); // Tanggal Senin berikutnya
echo $date4->format('Y-m-d'); // Seminggu dari sekarang
?>

Memodifikasi DateTime

<?php
$date = new DateTime('2024-01-15');

// Menambah waktu
$date->add(new DateInterval('P1D')); // Tambah 1 hari
echo $date->format('Y-m-d'); // 2024-01-16

$date->add(new DateInterval('P1M')); // Tambah 1 bulan
$date->add(new DateInterval('P1Y')); // Tambah 1 tahun

// Mengurangi waktu
$date->sub(new DateInterval('P1W')); // Kurangi 1 minggu

// Menggunakan modify
$date->modify('+2 days');
$date->modify('-1 month');
$date->modify('next Friday');

echo $date->format('Y-m-d H:i:s');
?>

DateInterval

<?php
// Format DateInterval: P[years]Y[months]M[days]DT[hours]H[minutes]M[seconds]S
$intervals = [
    'P1D' => '1 hari',
    'P1W' => '1 minggu',
    'P1M' => '1 bulan', 
    'P1Y' => '1 tahun',
    'PT1H' => '1 jam',
    'PT30M' => '30 menit',
    'PT45S' => '45 detik',
    'P2Y3M4DT5H6M7S' => '2 tahun 3 bulan 4 hari 5 jam 6 menit 7 detik'
];

$date = new DateTime('2024-01-15');

foreach ($intervals as $interval => $description) {
    $newDate = clone $date;
    $newDate->add(new DateInterval($interval));
    echo "$description: " . $newDate->format('Y-m-d H:i:s') . "<br>";
}
?>

Membandingkan DateTime

<?php
$date1 = new DateTime('2024-01-15');
$date2 = new DateTime('2024-01-20');

// Perbandingan
if ($date1 < $date2) {
    echo "Date1 lebih kecil dari Date2";
}

if ($date1 == $date2) {
    echo "Tanggal sama";
}

// Menghitung selisih
$diff = $date1->diff($date2);
echo "Selisih: " . $diff->days . " hari";
echo "Format: " . $diff->format('%R%a hari'); // +5 hari

// Informasi detail
echo $diff->y . " tahun ";
echo $diff->m . " bulan ";
echo $diff->d . " hari ";
echo $diff->h . " jam ";
echo $diff->i . " menit ";
echo $diff->s . " detik";
?>
Keuntungan DateTime: Lebih OOP, mendukung timezone dengan baik, dan memiliki banyak method yang berguna untuk manipulasi tanggal.

Mengelola Timezone

Timezone sangat penting untuk aplikasi global. PHP menyediakan class DateTimeZone untuk menangani berbagai timezone.

Setting Default Timezone

<?php
// Set default timezone
date_default_timezone_set('Asia/Jakarta');
echo date('Y-m-d H:i:s'); // Waktu Jakarta

// Lihat timezone yang tersedia
$timezones = DateTimeZone::listIdentifiers();
foreach (array_slice($timezones, 0, 10) as $timezone) {
    echo $timezone . "<br>";
}

// Timezone saat ini
echo "Current timezone: " . date_default_timezone_get();
?>

DateTime dengan Timezone

<?php
// DateTime dengan timezone tertentu
$jakarta = new DateTime('now', new DateTimeZone('Asia/Jakarta'));
$london = new DateTime('now', new DateTimeZone('Europe/London'));
$newyork = new DateTime('now', new DateTimeZone('America/New_York'));

echo "Jakarta: " . $jakarta->format('Y-m-d H:i:s T') . "<br>";
echo "London: " . $london->format('Y-m-d H:i:s T') . "<br>";
echo "New York: " . $newyork->format('Y-m-d H:i:s T') . "<br>";

// Mengubah timezone
$date = new DateTime('2024-01-15 14:30:00', new DateTimeZone('Asia/Jakarta'));
echo "Jakarta: " . $date->format('Y-m-d H:i:s T') . "<br>";

$date->setTimezone(new DateTimeZone('Europe/London'));
echo "London: " . $date->format('Y-m-d H:i:s T') . "<br>";
?>

Informasi Timezone

<?php
$timezone = new DateTimeZone('Asia/Jakarta');
$date = new DateTime('now', $timezone);

// Informasi timezone
echo "Nama: " . $timezone->getName() . "<br>";

// Offset dari UTC
$offset = $timezone->getOffset($date);
echo "Offset: " . ($offset / 3600) . " jam dari UTC<br>";

// Transitions (perubahan DST)
$transitions = $timezone->getTransitions(
    strtotime('2024-01-01'), 
    strtotime('2024-12-31')
);

foreach ($transitions as $transition) {
    echo date('Y-m-d H:i:s', $transition['ts']) . " - " . 
         $transition['abbr'] . " (Offset: " . 
         ($transition['offset'] / 3600) . "h)<br>";
}
?>

Timezone Helper Function

<?php
function convertTimezone($datetime, $fromTz, $toTz) {
    $date = new DateTime($datetime, new DateTimeZone($fromTz));
    $date->setTimezone(new DateTimeZone($toTz));
    return $date->format('Y-m-d H:i:s T');
}

function getTimezoneOffset($timezone) {
    $tz = new DateTimeZone($timezone);
    $date = new DateTime('now', $tz);
    return $tz->getOffset($date) / 3600;
}

// Penggunaan
echo convertTimezone('2024-01-15 14:30:00', 'Asia/Jakarta', 'Europe/London');
echo "Jakarta offset: " . getTimezoneOffset('Asia/Jakarta') . " jam";
?>
Penting: Selalu set timezone default di awal aplikasi dan simpan data dalam UTC untuk konsistensi.

Kalkulasi dan Validasi Waktu

PHP menyediakan berbagai cara untuk melakukan kalkulasi waktu dan validasi tanggal.

Kalkulasi Umur

<?php
function calculateAge($birthDate) {
    $birth = new DateTime($birthDate);
    $today = new DateTime();
    $age = $today->diff($birth);
    
    return [
        'years' => $age->y,
        'months' => $age->m,
        'days' => $age->d,
        'total_days' => $age->days
    ];
}

$age = calculateAge('1990-05-15');
echo "Umur: {$age['years']} tahun, {$age['months']} bulan, {$age['days']} hari";
echo "Total: {$age['total_days']} hari";
?>

Menghitung Hari Kerja

<?php
function countWorkdays($startDate, $endDate, $holidays = []) {
    $start = new DateTime($startDate);
    $end = new DateTime($endDate);
    $workdays = 0;
    
    while ($start <= $end) {
        $dayOfWeek = $start->format('N'); // 1 = Monday, 7 = Sunday
        $dateString = $start->format('Y-m-d');
        
        // Skip weekends and holidays
        if ($dayOfWeek < 6 && !in_array($dateString, $holidays)) {
            $workdays++;
        }
        
        $start->add(new DateInterval('P1D'));
    }
    
    return $workdays;
}

$holidays = ['2024-01-01', '2024-12-25'];
$workdays = countWorkdays('2024-01-01', '2024-01-31', $holidays);
echo "Hari kerja: $workdays hari";
?>

Validasi Tanggal

<?php
function validateDate($date, $format = 'Y-m-d') {
    $d = DateTime::createFromFormat($format, $date);
    return $d && $d->format($format) === $date;
}

function isLeapYear($year) {
    return (($year % 4 == 0) && ($year % 100 != 0)) || ($year % 400 == 0);
}

function getDaysInMonth($year, $month) {
    return date('t', mktime(0, 0, 0, $month, 1, $year));
}

// Penggunaan
var_dump(validateDate('2024-02-29')); // true (leap year)
var_dump(validateDate('2023-02-29')); // false (not leap year)
var_dump(validateDate('31/12/2024', 'd/m/Y')); // true

echo "2024 adalah tahun kabisat: " . (isLeapYear(2024) ? 'Ya' : 'Tidak');
echo "Februari 2024 memiliki " . getDaysInMonth(2024, 2) . " hari";
?>

Periode dan Range Tanggal

<?php
// DatePeriod untuk iterasi tanggal
$start = new DateTime('2024-01-01');
$end = new DateTime('2024-01-31');
$interval = new DateInterval('P1D');
$period = new DatePeriod($start, $interval, $end);

echo "Tanggal di Januari 2024:<br>";
foreach ($period as $date) {
    echo $date->format('Y-m-d l') . "<br>";
}

// Menghitung periode bisnis
function getBusinessDates($start, $end) {
    $period = new DatePeriod(
        new DateTime($start),
        new DateInterval('P1D'),
        new DateTime($end)
    );
    
    $businessDates = [];
    foreach ($period as $date) {
        if ($date->format('N') < 6) { // Monday = 1, Friday = 5
            $businessDates[] = $date->format('Y-m-d');
        }
    }
    
    return $businessDates;
}

$businessDates = getBusinessDates('2024-01-01', '2024-01-15');
print_r($businessDates);
?>
Tips: Gunakan DatePeriod untuk iterasi tanggal yang efisien dan mudah. Sangat berguna untuk report dan kalkulasi berkala.
Tutorial Saat Ini
Level: Menengah

Memerlukan pemahaman dasar PHP

Daftar Isi
Tips Belajar