PHP #17 - DateTime

02 Oct 2020 • ⏳ ~ 17 menit

 

DateTime

DateTime merupakan salah satu class dalam PHP berbasis OOP (Object Oriented Programming) yang digunakan untuk melakukan beberapa proses yang berkaitan dengan tanggal dan waktu. Sebelum DateTime ada, pengguna menggunakan fungsi date() yang berbasis procedural.

Sintaks date()

<?php 
  date($format, $timestamp);
?>
  • $format merepresentasikan tata cara penulisan tanggal dan waktu. Format yang dibentuk haruslah sesuai dengan format tanggal dan waktu PHP. Untuk pembahasan format, kita dapat melihatnya pada halaman ini di bagian selanjutnya.
  • $timestamp menerima nilai integer berupa waktu dan tanggal sekarang yang dikonversi menjadi detik (UNIX timestamp). Parameter ini bersifat opsional dan secara default bernilai waktu dan tanggal sekarang yang dikonversi menjadi detik. Penjelasan mengenai UNIX timestamp dapat kita lihat pada halaman ini di bagian selanjutnya.

Mari kita perhatikan contoh penerapannya.

<?php
  echo date('d-m-Y H:i:s');
  # Output (dapat berbeda): 16-09-2020 14:28:13
  
  echo date('d-m-Y H.i.s', 2199999423);
  # Output: 18-09-2039 11.57.03
?>

Penggunaan date() dalam PHP mulai tergantikan dengan DateTime yang berbasis OOP. DateTime dapat digunakan sejak PHP versi 5.2.

Sintaks DateTime

<?php 
  new DateTime($time, $timezone);
?>
  • $time menerima nilai berupa tanggal dan/atau waktu menurut zona waktu yang telah ditetapkan. Parameter ini bersifat opsional dan secara default bernilai 'now'.
  • $timezone merupakan parameter yang bertujuan untuk menetapkan zona waktu mana yang digunakan $time. Parameter ini bersifat opsional dan memiliki nilai default berupa null, yang berarti zona waktu yang digunakan adalah “UTC” (GMT).

Mari kita perhatikan contoh penggunaan DateTime.

<?php
  $utcDateTime = new DateTime();
  $asiaDateTime = new DateTime('now', new DateTimeZone('Asia/Jakarta'));
  $Apr30Utc = new DateTime('2020-04-30 07.00.00');
  $Apr30Asia = new DateTime('2020-04-30 07.00.00', new DateTimeZone('Asia/Jakarta'));
  $Sept2 = new DateTime('2 Sept 2019');
  $Sept3 = new DateTime('2019, 3 Sept');

  var_dump($utcDateTime);
  var_dump($asiaDateTime);
  var_dump($Apr30Utc);
  var_dump($Apr30Asia);
  var_dump($Sept2);
  var_dump($Sept3);
?>

Output dari kode di atas dapat berbeda. Berikut contoh hasil kode di atas.

object(DateTime)#1 (3) {
  ["date"]=>
  string(26) "2020-09-16 14:28:13.827293"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}

object(DateTime)#2 (3) {
  ["date"]=>
  string(26) "2020-09-16 21:43:56.495370"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(12) "Asia/Jakarta"
}

object(DateTime)#3 (3) {
  ["date"]=>
  string(26) "2020-04-30 07:00:00.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}

object(DateTime)#4 (3) {
  ["date"]=>
  string(26) "2020-04-30 07:00:00.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(12) "Asia/Jakarta"
}

object(DateTime)#5 (3) {
  ["date"]=>
  string(26) "2019-09-02 00:00:00.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}

object(DateTime)#6 (3) {
  ["date"]=>
  string(26) "2020-09-03 20:19:00.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}

Selanjutnya, kita akan membahas beberapa method DateTime yang sering digunakan dan sangat berguna dalam penerapannya.

setTimeZone()

setTimeZone() adalah method dari DateTime yang digunakan untuk menetapkan zona waktu yang diinginkan, mulai ada sejak PHP 5.2.0. Sebenarnya, kita telah menetapkan zona waktu pada saat mengisi nilai parameter kedua ($timezone) pada contoh kode sebelumnya. Namun, pada contoh tersebut kita langsung mengisi nilai $timezone tanpa memakai method setTimeZone() terlebih dahulu. Secara default, $timezone dalam PHP adalah “UTC”, namun kita dapat memodifikasinya melalui file php.ini.

Sintaks setTimeZone()

<?php
  $namaVariabel = new DateTime();
  $namaVariabel->setTimeZone(new DateTimeZone($timezone));
?>
  • $namaVariabel merupakan object dari DateTime yang akan ditentukan zona waktunya.
  • $timezone merupakan parameter yang bertujuan untuk menentukan zona waktu.

Berikut contoh penerapan setTimeZone().

<?php
  $newDate = new DateTime();
  var_dump($newDate);

  $newDate->setTimeZone(new DateTimeZone('Asia/Bangkok'));
  var_dump($newDate);
?>

Output dari kode di atas dapat berbeda, begitu juga untuk zona waktu default. Berikut contoh hasil kode di atas.

object(DateTime)#1 (3) {
  ["date"]=>
  string(26) "2020-09-16 22:13:44.955971"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}

object(DateTime)#1 (3) {
  ["date"]=>
  string(26) "2020-09-16 22:13:44.955971"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(12) "Asia/Bangkok"
}

Terdapat 1 cara lagi untuk menetapkan zona waktu dalam PHP, yaitu date_default_timezone_set(). Method ini hanya menerima satu parameter, yaitu zona waktu, date_default_timezone_set($timezone). Namun, method ini bertujuan untuk menetapkan zona waktu default pada kode-kode setelah method ini. Berikut merupakan contoh penerapannya.

<?php
  $newDate = new DateTime();
  var_dump($newDate);
  // Timezone "UTC"

  date_default_timezone_set("Asia/Jakarta");
  // Default timezone menjadi "Asia/Jakarta"

  var_dump($newDate);
  // Timezone $newDate tidak terpengaruh karena telah diinisialisasi sebelum pengaturan default timezone "Asia/Jakarta"

  $secondDate = new DateTime();
  var_dump($secondDate);
  // Mendapat pengaruh dari default timezone "Asia/Jakarta"
?>

Output dapat berbeda, tergantung pada pengaturan zona waktu default dan waktu pengujian kode. Berikut contoh hasil kode.

object(DateTime)#1 (3) {
  ["date"]=>
  string(26) "2020-09-16 22:13:44.955971"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}

object(DateTime)#1 (3) {
  ["date"]=>
  string(26) "2020-09-16 22:13:44.955971"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}

object(DateTime)#2 (3) {
  ["date"]=>
  string(26) "2020-09-16 22:13:44.955971"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(12) "Asia/Jakarta"
}

DateInterval - sub() & add()

DateInterval digunakan untuk mendapatkan jarak/interval waktu pada DateTime. DateInterval mulai ada di PHP sejak versi 5.3.0. Biasanya, method yang digunakan bersama DateInterval adalah sub() dan add(). Seperti namanya, sub() digunakan untuk pengurangan dan add() untuk penjumlahan pada DateTime.

Sintaks DateInterval dengan sub() dan add()

<?php 
  $namaVariabel->sub(new DateInterval($duration));

  $namaVariabel->add(new DateInterval($duration));
?>

$duration adalah parameter yang mengacu pada interval/durasi waktu dan/atau tanggal yang akan ditambahi/dikurangi. Parameter diawali dengan karakter P yang berarti Period. Terdapat beberapa daftar dari penunjuk periode yang harus kita ketahui untuk mengisi nilai dari $duration, antara lain: | Penunjuk Periode | Deskripsi | | :-: | :– | | Y | years (tahun) | | M | months (bulan) | | D | days (hari) | | W | weeks (minggu) | | H | hours (jam) | | M | minutes (menit) | | S | seconds (detik) |

  • Nilai W pada $duration akan dikonversi menjadi hari, sehingga kita tidak boleh menggunakannya bersamaan dengan D.
  • Jenis penunjuk periode harus dituliskan dari kiri dengan satuan skala terbesar hingga satuan skala terkecil di kanan. Jadi, tahun sebelum bulan, bulan sebelum hari, hari sebelum menit, dst.
  • Jika kita menerapkan penunjuk periode waktu (H, M, dan S), kita perlu mengawalinya dengan pemisah berupa karakter T yang berarti Time, misalnya PT4M dan P3DT3H2S.

Mari kita perhatikan contoh penerapan DateInterval pada kode berikut.

<?php
  $Aug14 = new DateTime('2020-08-14 12.00.00', new DateTimeZone("Asia/Jakarta"));
  // Penambahan sebanyak 7 tahun 5 bulan 4 hari pada $Aug14
  var_dump($Aug14->add(new DateInterval('P7Y5M4D')));

  $now18 = new DateTime('18.20.15', new DateTimeZone("Asia/Jakarta"));
  // Penambahan sebanyak 7 jam 14 menit 13 detik pada $now18
  var_dump($now18->add(new DateInterval('PT7H14M13S')));

  $Apr25 = new DateTime('2020-04-25 08.50.12', new DateTimeZone("Asia/Jakarta"));
  // Pengurangan sebanyak 1 bulan 1 minggu 2 jam 30 menit 15 detik pada $Apr25
  var_dump($Apr25->sub(new DateInterval('P1M1WT2H30M15S')));
?>
object(DateTime)#1 (3) {
  ["date"]=>
  string(26) "2028-01-18 12:00:00.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(12) "Asia/Jakarta"
}

object(DateTime)#2 (3) {
  ["date"]=>
  string(26) "2020-09-18 01:34:28.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(12) "Asia/Jakarta"
}

object(DateTime)#3 (3) {
  ["date"]=>
  string(26) "2020-03-18 06:19:57.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(12) "Asia/Jakarta"
}

Format DateTime

Tata cara menuliskan tanggal dan waktu tentunya sangat penting. Lantas bagaimana format DateTime pada PHP? Sebelum itu, kita perlu memahami method format() terlebih dahulu. Method ini bertujuan untuk memberi format tanggal dan waktu dari variabel DateTime yang telah ada. Method format() menerima parameter berupa format tanggal dan waktu yang ingin diterapkan pada DateTime. Format yang diisi harus sesuai dengan format yang ada. Selain method format(), kita juga dapat menerapkan fungsi date_format() yang memiliki tujuan yang sama dan bersifat procedural.

Sintaks format()

<?php
  $namaVariabel = new DateTime();

  $namaVariabel->format('DateTime_format_written_in_string');

  date_format($namaVariabel, 'DateTime_format_written_in_string')
?>

Parameter format() menerima format DateTime yang telah ditentukan dan dituliskan dalam bentuk string, misalnya 'd-m-Y H:i:s'.

Pertama-tama, mari kita perhatikan tabel format penanggalan (Date) berikut.

JenisKarakterKeteranganHasil
Hari & Tanggal
dRepresentasi tanggal dalam 1 bulan yang terdiri atas 2 digit yang diawali dengan 01.01 hingga 31
jRepresentasi tanggal dalam 1 bulan dengan digit seadanya yang diawali dengan 1.1 hingga 31
DRepresentasi hari dalam bentuk tulisan yang terdiri atas 3 huruf.Mon hingga Sun
lRepresentasi hari dalam bentuk tulisan bahasa Inggris yang lengkap.Monday hingga Sunday
NRepresentasi nama hari dalam bentuk angka (ada sejak PHP 5.1.0).1 (Monday) hingga 7 (Sunday)
wRepresentasi nama hari dalam bentuk angka, dengan indeks 0 untuk Minggu.0 (Sunday), 1 (Monday) hingga 6 (Saturday)
SRepresentasi akhiran ordinal bahasa Inggris untuk tanggal dalam sebulan, cocok bila diterapkan bersama dengan j.st, nd, rd, atau th
zRepresentasi hari dalam setahun dalam bentuk angka.1 hingga 365
Minggu
WRepresentasi minggu keberapa dari setahun dengan angka.contoh: 3 (Minggu ke-3 dalam setahun)
Bulan
FRepresentasi nama bulan secara lengkap dalam bahasa Inggris.January hingga December
mRepresentasi bulan dalam bentuk 2 digit angka yang diawali dengan 01.01 hingga 12
nRepresentasi bulan dengan digit seadanya yang diawali dengan 1.1 hingga 12
MRepresentasi nama bulan dalam bentuk kata dengan 3 huruf.Jan hingga Dec
tRepresentasi jumlah hari pada suatu bulan.28 hingga 31
Tahun
LMenentukan apakah tahun tersebut merupakan tahun kabisat atau bukan.0 (bukan kabisat) dan 1 (kabisat)
YMenampilkan tahun dalam bentuk 4 digit angka.contoh: 1970, 2020
yMenampilkan tahun dalam bentuk 2 digit angka.contoh: 70, 20

Untuk format lain, dapat kita rujuk pada DateInterval::__construct - php.net.

Mari kita perhatikan contoh penerapan format penanggalan.

<?php
  $date = new DateTime('2020-04-03 08.50.12', new DateTimeZone("Asia/Jakarta"));
  
  echo $date->format('d-m-Y');      # Output: 03-04-2020
  echo $date->format('j-n-y');      # Output: 3-4-20
  echo $date->format('l, d F Y');   # Output: Friday, 03 April 2020
  echo $date->format('D, j M Y');   # Output: Fri, 3 Apr 2020
  echo $date->format('M y, jS');    # Output: Apr 20, 3rd

  // Representasi nama hari dengan angka
  echo $date->format('N');          # Output: 5
  echo $date->format('w');          # Output: 5

  // Representasi hari ke-n dan minggu ke-n
  echo $date->format('z');          # Output: 93
  echo $date->format('W');          # Output: 14

  // Representasi jumlah hari bulan tersebut dan identifikasi tahun kabisat
  echo $date->format('t');          # Output: 30
  echo $date->format('L');          # Output: 1

  // Bentuk procedural
  echo date_format($date, 'd-m-Y');      # Output: 03-04-2020
  echo date_format($date, 'j-n-y');      # Output: 3-4-20
  echo date_format($date, 'l, d F Y');   # Output: Friday, 03 April 2020
  echo date_format($date, 'D, j M Y');   # Output: Fri, 3 Apr 2020
  echo date_format($date, 'M y, jS');    # Output: Apr 20, 3rd
?>

Selain format untuk penanggalan, PHP juga memiliki format untuk waktu. Perhatikan tabel format waktu (Time) berikut.

KarakterKeteranganHasil
aRepresentasi Ante meridiem dan Post meridiem dalam huruf kecil.am atau pm
ARepresentasi Ante meridiem dan Post meridiem dalam huruf besar.AM atau PM
gRepresentasi jam dalam format 12 jam dengan digit angka seadanya.1 hingga 12
GRepresentasi jam dalam format 24 jam dengan digit angka seadanya.0 hingga 23
hRepresentasi jam dengan format 12 jam dalam bentuk 2 digit angka.01 hingga 12
HRepresentasi jam dengan format 24 jam dalam bentuk 2 digit angka.00 hingga 23
iRepresentasi menit dalam bentuk 2 digit angka.00 hingga 59
sRepresentasi detik dalam bentuk 2 digit angka.00 hingga 59
uRepresentasi mikrodetik (ada sejak PHP 5.2.2).contoh: 194221
vRepresentasi milidetik (ada sejak PHP 7.0.0).contoh: 729

Untuk format lain, dapat kita rujuk pada DateInterval::__construct - php.net.

Mari kita perhatikan contoh penerapan format waktu.

<?php
  $date = new DateTime('2020-04-03 08.50.12.423621', new DateTimeZone("Asia/Jakarta"));
  
  echo $date->format('h:i:s A');    # Output: 08:50:12 AM
  echo $date->format('g:i:s a');    # Output: 8:50:12 am
  echo $date->format('H.i.s');      # Output: 08.50.12
  echo $date->format('G.i.s');      # Output: 8.50.12
  
  // Representasi milidetik dan mikrodetik
  echo $date->format('u');          # Output: 423621
  echo $date->format('v');          # Output: 423

  // Bentuk procedural
  echo date_format($date, 'h:i:s A');    # Output: 08:50:12 AM
  echo date_format($date, 'g:i:s a');    # Output: 8:50:12 am
  echo date_format($date, 'H.i.s');      # Output: 08.50.12
  echo date_format($date, 'G.i.s');      # Output: 8.50.12
?>

Kita juga dapat menggunakan format() pada DateInterval. Mari kita lihat contoh kode berikut.

<?php
  $Aug14 = new DateTime('2020-08-14 12.00.00', new DateTimeZone("Asia/Jakarta"));
  $Apr25 = new DateTime('2020-04-25 08.50.12', new DateTimeZone("Asia/Jakarta"));

  // Penambahan sebanyak 6 hari pada $Aug14
  var_dump($Aug14->add(new DateInterval('P6D'))->format('l, d F Y ~ h:i:s A'));
  # Output: string(38) "Thursday, 20 August 2020 ~ 12:00:00 PM"

  // Pengurangan sebanyak 1 bulan 1 minggu 2 jam 30 menit 15 detik pada $Apr25
  var_dump($Apr25->sub(new DateInterval('P1M1WT2H30M15S'))->format('M y, jS H.i.s'));
  # Output: string(21) "Mar 20, 18th 06.19.57"
?>

Timestamp

Unix Timestamp merupakan sebuah format bernilai detik dari suatu waktu, yang terhitung sejak 1 Januari 1970 00:00:00 GMT (Unix Epoch time). Penggunaan Timestamp sekilas sangat rumit dibaca karena hanya menampilkan detik saja. Namun, Timestamp sangat baik digunakan karena waktu yang kita dapatkan akan menjadi sangat rinci.

Kita dapat mendapatkan nilai Timestamp saat ini menggunakan fungsi time(). Mati kita perhatikan contoh penerapannya.

<?php
  $current_timestamp = time();
  
  echo $current_timestamp;
  # Output: 1600275620
?>

Setiap kali kita melakukan refresh page, output dari time() akan berubah.

Kita juga dapat mendapatkan Timestamp dari waktu tertentu dengan memanfaatkan fungsi mktime(). Fungsi ini memiliki 6 parameter dengan sintaks penulisan berupa mktime($hour, $minute, $second, $month, $day, $year). Mari kita perhatikan contoh penerapannya yang dikolaborasikan dengan date().

<?php
  // Membentuk Timestamp dari 21:15:40 16-09-2020
  $time = mktime(21, 15, 40, 9, 16, 2020);

  var_dump($time);
  # Output: int(1600290940)
  
  var_dump(date("l, d F Y H:i:s", $time));
  # Output: string(38) "Wednesday, 16 September 2020 21:15:40"
?>

Selain fungsi-fungsi di atas, kita juga dapat mendapatkan Timestamp dengan memanfaatkan method getTimestamp() dari DateTime secara OOP. Mari kita lihat contoh penerapan method ini.

<?php
  $nowTimestamped = new DateTime();
  $Sep16Jakarta = new DateTime('2020-09-16 21.15.40', new DateTimeZone("Asia/Jakarta"));

  var_dump($nowTimestamped->getTimestamp());
  # Output: int(1600508131)
  var_dump($Sep16Jakarta->getTimestamp());
  # Output: int(1600265740)
?>

Untuk mengonversi Timestamp menjadi tanggal dan waktu yang mudah dibaca, kita dapat menggunakan fungsi gmdate() dan method setTimestamp() pada DateTime. Fungsi gmdate() memerlukan parameter berupa format tanggal/waktu dan nilai integer dari Timestamp. Sedangkan, method setTimestamp() hanya memerlukan nilai Timestamp. Mari simak contoh kode berikut.

<?php
  $Sep16 = (new DateTime('2020-09-16 21.15.40'))->getTimestamp();

  var_dump($Sep16);
  var_dump(gmdate('l, d F Y H:i:s', $Sep16));

  $timestampOfSep16 = (new DateTime())->setTimestamp($Sep16);
  var_dump($timestampOfSep16);
  var_dump($timestampOfSep16->format('l, d F Y H:i:s'));
?>
int(1600290940)
string(38) "Wednesday, 16 September 2020 21:15:40"

object(DateTime)#1 (3) {
  ["date"]=>
  string(26) "2020-09-16 21:15:40.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
string(38) "Wednesday, 16 September 2020 21:15:40"

DateTime juga dapat menerima nilai berupa Timestamp, hanya saja penulisannya memerlukan karakter @ sebelum nilai Timestamp disematkan. Berikut contoh penulisannya.

<?php
  // Dengan nilai Timestamp secara langsung
  $Sep16 = new DateTime("@1600290940");

  // Dengan nilai Timestamp tersimpan dalam variabel nowTimestamped
  $nowTimestamped = time();
  $now = new DateTime("@{$nowTimestamped}");
?>

setDate()

setDate() merupakan sebuah method dari DateTime yang berfungsi untuk menetapkan tanggal yang diinginkan. Method ini memberikan hasil kembalian berupa object DateTime dan menerima 3 parameter integer dengan sintaks setDate($year, $month, $day). Mari kita perhatikan contoh penerapannya.

<?php
  date_default_timezone_set("Asia/Jakarta");

  $independenceDay = new DateTime();
  $whatsoeverDay = new DateTime();

  $independenceDay->setDate(1945, 8, 17);
  $whatsoeverDay->setDate(2023, 15, 32);

  var_dump($independenceDay);
  var_dump($whatsoeverDay);

  var_dump($independenceDay->format('Y-m-d'));
  var_dump($whatsoeverDay->format('Y-m-d'));
?>
object(DateTime)#1 (3) {
  ["date"]=>
  string(26) "1945-08-17 17:21:05.262133"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(12) "Asia/Jakarta"
}

object(DateTime)#2 (3) {
  ["date"]=>
  string(26) "2024-04-01 17:21:05.262139"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(12) "Asia/Jakarta"
}

string(10) "1945-08-17"
string(10) "2024-04-01"

Apabila nilai hari yang dimasukkan melewati batas hari pada bulan tersebut, secara otomatis nilai bulan akan bertambah dan nilai tanggal disesuaikan. Hal ini juga berlaku pada bulan.

Sebelum method setDate() ada, dulunya kita memanfaatkan fungsi date_date_set() yang bersifat procedural. Fungsi ini menerima 4 parameter wajib, yaitu parameter pertama berupa nama variabel (object dari DateTime) yang menampung hasil fungsi dan sisa parameter sama seperti method setDate(). Mari kita perhatikan contoh penerapannya.

<?php
  date_default_timezone_set("Asia/Jakarta");

  $independenceDay = new DateTime();
  $whatsoeverDay = new DateTime();

  date_date_set($independenceDay, 1945, 8, 17);
  date_date_set($whatsoeverDay, 2023, 15, 32);

  var_dump($independenceDay);
  var_dump($whatsoeverDay);
?>
object(DateTime)#1 (3) {
  ["date"]=>
  string(26) "1945-08-17 17:21:05.262133"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(12) "Asia/Jakarta"
}

object(DateTime)#2 (3) {
  ["date"]=>
  string(26) "2024-04-01 17:21:05.262139"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(12) "Asia/Jakarta"
}

diff()

diff() bertujuan untuk mencari jarak antara hari, bulan, atau tahun dari dua waktu, merupakan method dari DateTime. Method ini mengembalikan hasil berupa object dengan anggota berupa interval-interval waktu, dapat juga mengembalikan false jika proses gagal.

Sintaks diff()

<?php
  $origin->diff($target, $absolute);
?>
  • $origin merupakan object dari DateTime sebagai waktu yang dibandingkan.
  • $target merupakan object dari DateTime sebagai waktu pembanding.
  • $absolute merupakan parameter boolean yang memperbolehkan nilai interval yang dikembalikan bersifat mutlak atau tidak. Parameter ini bersifat opsional dan memiliki nilai default berupa false.

Fungsi ini memiliki bentuk procedural, yaitu date_diff($origin, $target, $absolute).

Mari kita perhatikan contoh penerapannya pada kode berikut.

<?php
  $Sept20 = new DateTime('2020-11-20');
  $Oct13 = new DateTime('2020-10-13');
  
  var_dump($Sept20->diff($Oct13));
  // var_dump(date_diff($Sept20, $Oct13));

  var_dump($Oct13->diff($Sept20));
  // var_dump(date_diff($Oct13, $Sept20));

  var_dump($Oct13->diff($Sept20, true));
  // var_dump(date_diff($Oct13, $Sept20, true));
?>
object(DateInterval)#3 (16) { ["y"]=> int(0) ["m"]=> int(1) ["d"]=> int(7) ["h"]=> int(0) ["i"]=> int(0) ["s"]=> int(0) ["f"]=> float(0) ["weekday"]=> int(0) ["weekday_behavior"]=> int(0) ["first_last_day_of"]=> int(0) ["invert"]=> int(1) ["days"]=> int(38) ["special_type"]=> int(0) ["special_amount"]=> int(0) ["have_weekday_relative"]=> int(0) ["have_special_relative"]=> int(0) }

object(DateInterval)#3 (16) { ["y"]=> int(0) ["m"]=> int(1) ["d"]=> int(7) ["h"]=> int(0) ["i"]=> int(0) ["s"]=> int(0) ["f"]=> float(0) ["weekday"]=> int(0) ["weekday_behavior"]=> int(0) ["first_last_day_of"]=> int(0) ["invert"]=> int(0) ["days"]=> int(38) ["special_type"]=> int(0) ["special_amount"]=> int(0) ["have_weekday_relative"]=> int(0) ["have_special_relative"]=> int(0) }

object(DateInterval)#3 (16) { ["y"]=> int(0) ["m"]=> int(1) ["d"]=> int(7) ["h"]=> int(0) ["i"]=> int(0) ["s"]=> int(0) ["f"]=> float(0) ["weekday"]=> int(0) ["weekday_behavior"]=> int(0) ["first_last_day_of"]=> int(0) ["invert"]=> int(0) ["days"]=> int(38) ["special_type"]=> int(0) ["special_amount"]=> int(0) ["have_weekday_relative"]=> int(0) ["have_special_relative"]=> int(0) }

Pada kode di atas, terdapat perbedaan pada properti ["invert"]. Jika properti ini bernilai int(1), nilai dari intervalnya adalah negatif. Jika bernilai int(0), nilai interval kedua tanggal adalah positif.

Kita dapat mendapatkan nilai properti tertentu dengan memanfaatkan operator ->. Kita juga dapat mendapatkan nilai interval dengan memanfaatkan fungsi format() yang diisi dengan '%R%a'. Mari kita perhatikan contoh penerapannya.

<?php
  $origin = new DateTime('2020-11-20');
  $target = new DateTime('2020-10-13');
  
  var_dump($origin->diff($target)->days);
  # Output: int(38)
  var_dump($target->diff($origin)->d);
  # Output: int(7)
  var_dump($target->diff($origin, true)->m);
  # Output: int(1)
  
  var_dump($origin->diff($target)->format('%R%a'));
  # Output: string(3) "-38
  var_dump($target->diff($origin)->format('%R%a days'));
  # Output: string(8) "+38 days"
  var_dump($target->diff($origin, true)->format('%R%a hari'));
  # Output: string(8) "+38 hari"
?>

strtotime()

strtotime() merupakan fungsi yang bertujuan untuk mengubah deskripsi tanggal dan waktu dalam bahasa Inggris menjadi Unix timestamp. Fungsi ini mengembalikan nilai berupa integer dari timestamp, juga dapat mengembalikan nilai false jika terjadi kegagalan.

Sintaks strtotime()

<?php
  strtotime($datetime, $now);
?>
  • $datetime memuat string dengan format tanggal dan waktu yang dapat dikonversi fungsi ini. Dalam menulis parameter ini, terdapat beberapa hal yang perlu diperhatikan, antara lain:
    • Jika tahun yang dimuat dalam $datetime berdigit dua, nilai 0-69 diartikan sebagai 2000-2069, sedangkan nilai 70-100 diartikan sebagai 1970-2000.
    • Dalam membentuk format tanggal $datetime, pemisah / diasumsikan sebagai penanggalan Amerika (m/d/y), sedangkan pemisah - diasumsikan sebagai penanggalan Eropa (d-m-y).
  • $now merupakan parameter opsional yang memuat nilai timestamp dan berfungsi menentukan dasar perhitungan terhadap tanggal terkait. Parameter ini secara default bernilai time().

Fungsi strtotime() dapat kita padukan dengan date() untuk membentuk format tanggal dan waktunya. Mari kita perhatikan contoh kode berikut.

<?php
  $today = 'now';
  $firstDayLastMonth = 'First day of last month';
  $calculateTime = '-2 days +5 hours';
  $nextSat = 'next Saturday';
  $lastTue = 'last Tuesday';
  $lastDayFeb2004 = 'Last day of February 2004';
  $Apr25 = '25 April 2020'; 

  // Procedural
  echo strtotime($today);
  # Output: 1601474908
  echo date('d-m-Y H.i.s', strtotime($today));
  # Output: 30-09-2020 14.08.28
  echo date('d-m-Y H.i.s', strtotime($firstDayLastMonth));
  # Output: 01-08-2020 14.08.28
  echo date('d-m-Y H.i.s', strtotime($calculateTime));
  # Output: 28-09-2020 19.08.28
  echo date('d-m-Y H.i.s', strtotime($nextSat));
  # Output: 03-10-2020 00.00.00
  echo date('d-m-Y H.i.s', strtotime($lastTue));
  # Output: 29-09-2020 00.00.00
  echo date('d-m-Y H.i.s', strtotime($lastDayFeb2004));
  # Output: 29-02-2004 00.00.00
  echo date('d-m-Y H.i.s', strtotime($Apr25));
  # Output: 25-04-2020 00.00.00
  
  // Object Oriented
  echo (new DateTime($today))->format('d-m-Y H.i.s');
  # Output: 30-09-2020 14.08.28
  echo (new DateTime($firstDayLastMonth))->format('d-m-Y H.i.s');
  # Output: 01-08-2020 14.08.28
  echo (new DateTime($calculateTime))->format('d-m-Y H.i.s');
  # Output: 28-09-2020 19.08.28
  echo (new DateTime($nextSat))->format('d-m-Y H.i.s');
  # Output: 03-10-2020 00.00.00
  echo (new DateTime($lastTue))->format('d-m-Y H.i.s');
  # Output: 29-09-2020 00.00.00
  echo (new DateTime($lastDayFeb2004))->format('d-m-Y H.i.s');
  # Output: 29-02-2004 00.00.00
  echo (new DateTime($Apr25))->format('d-m-Y H.i.s');
  # Output: 25-04-2020 00.00.00

  // Hasil output dapat berbeda
?>

createFromFormat()

createFromFormat() merupakan salah satu static method dari DateTime dan mulai berlaku sejak PHP 5.3.0+. Method ini mengembalikan DateTime object berdasarkan format tanggal dan waktu yang ditentukan, juga dapat mengembalikan nilai false jika terjadi kegagalan. Fungsi ini juga memiliki bentuk procedural berupa date_create_from_format()

Sintaks createFromFormat() alias date_create_from_format()

<?php
  DateTime::createFromFormat($format, $datetime, $timezone);

  date_create_from_format($format, $datetime, $timezone);
?>
  • $format digunakan untuk menentukan format tanggal dan waktu yang akan diterima pada parameter $datetime. Format disematkan dalam bentuk string dan harus sesuai dengan format DateTime yang ada. Untuk menambahkan karakter tertentu, kita dapat memanfaatkan tanda \ sebagai karakter escape.
  • $datetime memuat nilai string yang mewakili tanggal dan waktu. Parameter $datetime dituliskan dengan format yang sesuai dengan parameter $format.
  • $timezone merupakan parameter opsional dan berfungsi untuk menentukan zona waktu, penulisan memanfaatkan DateTimeZone. Jika parameter ini diabaikan, zona waktu default akan digunakan. Parameter ini akan diabaikan jika $datetime mengandung Unix timestamp maupun menunjukkan sebuah zona waktu.

Mari kita perhatikan contoh penerapannya pada kode berikut.

<?php
  $newDate = DateTime::createFromFormat('j F Y', '15 May 2009', new DateTimeZone('Asia/Jakarta'));
  var_dump($newDate);

  $newDate = date_create_from_format('d-m-Y h:i:s A', '15-02-2020 08:50:12 AM');
  var_dump($newDate);

  $newDate = DateTime::createFromFormat('H\h i\m s\s', '23h 15m 03s');
  var_dump($newDate);
?>
object(DateTime)#2 (3) {
  ["date"]=>
  string(26) "2009-05-15 16:28:33.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(12) "Asia/Jakarta"
}

object(DateTime)#1 (3) {
  ["date"]=>
  string(26) "2020-02-15 08:50:12.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(13) "Europe/Berlin"
}

object(DateTime)#2 (3) {
  ["date"]=>
  string(26) "2020-09-19 23:15:03.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(13) "Europe/Berlin"
}

Pengayaan

Kita dapat melakukan perbandingan terhadap dua object dari DateTime dengan menerapkan operator pembanding. Mari kita perhatikan contoh kode berikut.

<?php
  $now = new DateTime('now');
  $tomorrow = new DateTime('tomorrow');
  $yesterday = new DateTime('yesterday');

  var_dump($now == $tomorrow);
  # Output: bool(false)
  var_dump($yesterday < $tomorrow);
  # Output: bool(true)
  var_dump($yesterday > $now);
  # Output: bool(false)
?>

Kita dapat menggunakan beberapa predefined constant untuk menentukan format tanggal dan waktu dalam mempermudah penulisan sesuai standar yang telah ditentukan bersama. Berikut beberapa predefined constant tersebut.

Predefined ConstantDate Format
DATE_ATOMAtom (2016-07-22T14:50:01+00:00)
DATE_COOKIEHTTP Cookies (Friday, 22-Jul-16 14:50:01 UTC)
DATE_RSSRSS (Fri, 22 Jul 2016 14:50:01 +0000)
DATE_W3CWorld Wide Web Consortium (2016-07-22T14:50:01+00:00)
DATE_ISO8601ISO-8601 (2016-07-22T14:50:01+0000)
DATE_RFC822RFC 822 (Fri, 22 Jul 16 14:50:01 +0000)
DATE_RFC850RFC 850 (Friday, 22-Jul-16 14:50:01 UTC)
DATE_RFC1036RFC 1036 (Fri, 22 Jul 16 14:50:01 +0000)
DATE_RFC1123RFC 1123 (Fri, 22 Jul 2016 14:50:01 +0000)
DATE_RFC2822RFC 2822 (Fri, 22 Jul 2016 14:50:01 +0000)
DATE_RFC3339Sama seperti DATE_ATOM (2016-07-22T14:50:01+00:00)

Perhatikan contoh penerapannya pada kode berikut.

<?php
  echo date(DATE_ATOM, mktime(0, 0, 0, 8, 15, 1947));
  # Output: 1947-08-15T00:00:00+05:30
?>
PHP

PHP #16 - Array (Bag. II)

comments powered by Disqus