Bug Y2K38 pada Fungsi date() PHP

Agar tidak bertele-tele, coba saja kode PHP berikut ini.

<?php
echo date('l d F Y H:i:s', strtotime('2038-02-19 3:14:07'));

Seperti yang kita tau, fungsi date() pada kode PHP di atas akan mengembalikan sebuah string waktu sesuai format ‘l d F Y H:i:s’. Harusnya pada browser akan tercetak:

Friday 19 February 2038 03:14:07

Namun jika waktu yang tercetak tidak seperti di atas, berarti aplikasi PHP Anda mempunyai kemungkinan terkena bug Y2K38.

Apa yang dimaksud bug Y2K38? Y2K38 yang disebut juga sebagai Unix Millenium Bug, dapat mempengaruhi sistem yang menggunakan 32-bit signed integer untuk merepresentasikan waktu (hari, tanggal, bulan, tahun, jam, menit, dsb). Sebagai patokan awalnya adalah Kamis, 1 Januari 1970 00:00:00 UTC dan akan berakhir pada Selasa, 19 Januari 2038 03:14:07 UTC. Jika waktu sudah melewati 19 Januari 2038 03:14:07 UTC, akan terjadi integer overflow. Semua bit sudah terpakai, kecuali bit pertama yang tidak boleh digunakan karena sebagai signed bit (0 = positif, 1 = negatif).

Kondisi signed bit yang diinkremen (ditambah dengan 1) selama proses perhitungan maju ini mengakibatkan nilainya mendadak berubah menjadi negatif, dalam kasus integer overflow ini nilainya menjadi negatif yang maksimum (angka paling kecil). Kemudian proses perhitungan maju berlanjut sampai negatif 0. Hal ini akan mengacaukan perhitungan waktu pada sistem. Gambar yang diambil dari Wikimedia ini menjelaskan dengan sempurna proses tersebut.

Bug Y2K38

Tahun 2038 masih lebih dari 20 tahun lagi, seharusnya masalah ini tidak perlu dikuatirkan. Pada tahun itu mungkin aplikasi yang Anda buat sekarang sudah usang dan tidak digunakan. Akan tetapi sebagai seorang programer yang baik sudah seharusnya memikirkan segala kemungkinan. Mungkin saja ada orang yang memakai kode yang Anda buat untuk aplikasi lain yang membutuhkan perhitungan waktu sampai 30 tahun ke depan.

Menggunakan sistem 64-bit mungkin dapat menyelamatkan Anda, karena bagaimanapun juga 64-bit signed integer jauh lebih lebar jangkauannya dibanding 32-bit signed integer. Tapi saya belum pernah mencoba sejauh itu. Alternatif lain yang lebih mudah yaitu dengan menggunakan class PHP DateTime yang diperkenalkan mulai PHP versi 5.2.

<?php
$mydate = new DateTime('2038-02-19 3:14:07');
echo $mydate -> format('l d F Y H:i:s');

Dengan menggunakan DateTime aplikasi PHP tidak terkena bug Y2K38, karena mampu menangani waktu sampai pada 31 Desember 9999! Mungkin Anda berniat mewariskan kode ini untuk generasi berikutnya 😀

About Sibudi

Ubuntu user | Loves books | Blogger | Web Developer | Learn PHP, JavaScript, Ruby & Python the hard way

28. June 2012 by Sibudi
Categories: Troubleshooting | Tags: , , | 2 comments

Comments (2)

  1. Pingback: Menyesuaikan Zona Waktu di MySQL dan PHP | Sibudi </>

  2. Pingback: Menyesuaikan Zona Waktu di MySQL dan PHP – PADIStudio

Leave a Reply

Required fields are marked *