Skip to main content

[PHP] mkdate problem dan format tanggal

Ternyata, fungsi mkdate untuk UNIX tidak bisa meng-handle tanggal sebelum tahun 1970. Jadi misalnya ada tanggal=12, bulan=3, tahun=1965, terus aku buat mkdate(0,0,0,bulan,tanggal,tahun), maka hasilnya error. Dan ketika aku manfaatkan date('m-d-y', mkdate(0,0,0,bulan,tanggal,tahun)) tadi, hasilnya adalah 1-1-1970.

Wah, padahal aku perlu fungsi ini untuk memformat tampilan tanggal, yang notabene diambil dari database. Misal dari database aku temukan tanggal, dengan format yyyy-mm-dd, misal 1965-03-12. Aku ingin ada fungsi yang bisa mengikuti standard format php untuk tanggal, sehingga tanggal tersebut bisa tampil dengan format tertentu. Misalnya format 'd-M-y',hasilnya 12-Mar-65, kalau format 'm/d/y' hasilnya '03/12/65.

Sebelumnya aku pakai fungsi berikut:

function pgDateFormat($dateData,$strFormat) {
list($strTahun,$strBulan,$strTanggal) = explode("-",$dateData);
$strHasil = date($strFormat,mktime(0,0,0,$strBulan,$strTanggal,$strTahun));
return $strHasil;
} //end of pgDateFormat


Tapi ternyata karena ada keterbatasan dari mktime, akhirnya hasilnya selalu error jika tanggal yang diberikan dibawah 1970.

Setelah berjuang ... akhirnya aku temukan fungsi sendiri (jadinya manual, dan sederhana), seperti ini:

function pgDateFormat($dateData,$strFormat) {

list($intTahun,$intBulan,$intTanggal) = explode("-",$dateData);

// loop per karakter
$intLength = strlen($strFormat);
$strHasil = "";
for ($i = 0; $i < $intLength; $i++) {
if (strpos("/-: ,.",$strFormat[$i]) != FALSE) { // delimiter
$strHasil .= $strFormat[$i]; }
else if ($strFormat[$i] == 'd') { // tanggal 2 digit
$strHasil .= $intTanggal; }
else if ($strFormat[$i] == 'j') { // tanggal tidak harus 2 digit
$strHasil .= (int)$intTanggal; }
else if ($strFormat[$i] == 'm') { // bulan, angka 2 digit
$strHasil .= $intBulan; }
else if ($strFormat[$i] == 'M') { // bulan, 3 huruf
$strHasil .= getBulanSingkat((int)$intBulan); }
else if ($strFormat[$i] == 'n') { // bulan, angka tidak harus 2 digit
$strHasil .= (int)$intBulan; }
else if ($strFormat[$i] == 'F') { // bulan, 3 huruf
$strHasil .= getBulan((int)$intBulan); }
else if ($strFormat[$i] == 'y') { // tahun 2 digit
$strHasil .= substr($intTahun,2,2); }
else if ($strFormat[$i] == 'Y') { // bulan, angka 2 digit
$strHasil .= $intTahun; }
} return
$strHasil;
} //end of pgDateFormat



Seharusnya bisa lebih sederhana menggunakan regular expression, cuma lagi malas belajarnya. Fungsi ini juga cuma terbatas untuk format tanggal, belum sampai format hari atau jam.

Comments

Anonymous said…
ini regular expressionnya untuk validasi yyyy-mm-dd hh-mm-ss

([0-9]{4})-([0-9]{2})-([0-9]{2})[ ]([0-9]{2}):([0-9]{2}):([0-9]{2})
Anonymous said…
Sip, thanks Bung Benny.

Cuma pertanyaannya, apakah itu sudah mendukung validasi tentang tahun kabisat dan juga tanggal-tanggal seperti 2006-04-31, 2000-13-1 ?

Thanks anyway....

Popular posts from this blog

PostGreSQL :: Hitung Umur

Ternyata untuk menghitung umur dari data yang disimpan di PostGreSQL sangat gampang. PostGreSQL sendiri sudah menyediakan fungsi yang mendukung. Beberapa fungsi yang bisa dipakai adalah AGE dan EXTRACT. AGE dipakai untuk menghitung umur dari sebuah data, dibandingkan dengan hari ini, atau dengan data lain (tipenya timestamp). Misal: age(timestamp '1980-09-27'), akan menghasilkan nilai (bertipe interval) "24 years 1 mon 25 days". Nah, kalau mau mengambil nilai tahunnya saja, tinggal menggunakan EXTRACT Contoh: EXTRACT(year FROM AGE(timestamp '2001-09-27')), hasilnya akan jadi 24.

PHP :: Selisih Jam

Setelah kemarin kesulitan untuk melakukan increment ataupun decrement terhadap variabel waktu (date/time) di PHP, kali ini nemuin masalah untuk mencari selisih waktu (dari satu jam ke jam tertentu), yang perlu untuk ngitung lembur karyawan. Tadinya kepikiran untuk buat fungsi sendiri, yang flow -nya kira-kira begini: - masing-masing dipisah menjadi jam, menit, detik - bandingkan antara keduanya. - lakukan pengurangan terhadap masing-masing komponen (jam, menit dan detik) - gabungkan hasil perhitungan ... (selisih jam + selisih menit + selisih detik) Tapi waktu aku ingat kasus Next Date, ... muncul ide untuk menggunakan cara yang sama, yaitu memanfaatkan format UNIX timestamp, terus nyoba mencari selisihnya. TERNYATA BERHASIL !!! Flownya seperti ini: - masing-masing dipisah menjadi jam, menit,detik - ubah masing-masing ke format timestamp, gunakan fungsi mktime() - kurangkan kedua jam - hasilnya dibagi 60 (karena satuannya pakai menit), sementara selisih timestamp itu dalam detik Algori

Delphi :: Split String

Akhirnya ketemu juga cara untuk melakukan split string. (Terbiasa pakai PHP sih, yang sangat memanjakan dalam pengelolaan string.) Di sini memanfaatkan TStringList, unit Classes. // procedure untuk split string procedure Split (const Delimiter: Char; // delimiter charachter Input: string; // input string const Strings: TStrings) ; // list of string result begin Assert(Assigned(Strings)) ; Strings.Clear; Strings.Delimiter := Delimiter; Strings.DelimitedText := Input; end; // contoh pemakaian procedure TForm1.Button1Click(Sender: TObject) ; var A: TStringList; begin A := TStringList.Create; try Split(' ', 'your delphi guide', A) ; ShowMessage(a[0]) ; //your ShowMessage(a[1]) ; //delphi ShowMessage(a[2]) ; //guide finally A.Free; end; end; Source : http://delphi.about.com/cs/adptips2002/a/bltip1102_5.htm Wheew .. akhirnya. One step ahead!!