Pada kesempatan kali ini kita akan membahas cara membuat format tanggal indonesia dengan PHP.
Biasanya, tanggal standar yang disimpan pada database berformat YYYY-MM-DD, misal 2016-03-20, sedangkan ketika ditampilkan pada web biasanya menggunakan nama bulan misal 20 Maret 2016.
PHP sendiri telah menyediakan banyak fungsi untuk mengubah format tanggal, namun, semua format tanggal tersebut berbahasa Inggris, misal, kita ubah tanggal diatas dengan menyertakan nama bulan
<?php
echo date('d F Y', strtotime('2016-03-20')); // Hasil 20 March 2016
// Tanggal sekarang
echo date('d F Y'); // Hasil 17 December 2016
I. Membuat Format Tanggal Indonesia Dengan PHP
Karena kita tidak bisa menggunakan fungsi bawaan PHP secara penuh, maka, untuk untuk mengubah nama bulan ke bahasa Indonesia, kita harus melakukannya secara “semi manual”, dimana kita mendefinisikan nama bulan satu persatu.
Ide dasarnya adalah sebagai berikut:
$bulan = array (1 => 'Januari',
'Februari',
'Maret',
'April',
'Mei',
'Juni',
'Juli',
'Agustus',
'September',
'Oktober',
'November',
'Desember'
);
echo $bulan[3]; // Maret
Pada contoh diatas, kita menggunakan array yang berisi nama bulan.
Seperti pada pembahasan tentang array, index awal dari array bisa angka 0
atau 1. Pada contoh diatas, kita buat index dengan nilai awal 1
, sehingga sama dengan bilangan bulan (1 s.d 12);
Selanjutnya, agar script tidak ditulis berulang ulang, maka kita perlu memasukkannya ke dalam fungsi, sehingga, nantinya kita cukup memanggil nama fungsi tersebut:
function tanggal_indo($tanggal)
{
$bulan = array (1 => 'Januari',
'Februari',
'Maret',
'April',
'Mei',
'Juni',
'Juli',
'Agustus',
'September',
'Oktober',
'November',
'Desember'
);
$split = explode('-', $tanggal);
return $split[2] . ' ' . $bulan[ (int)$split[1] ] . ' ' . $split[0];
}
echo tanggal_indo('2016-03-20'); // 20 Maret 2016
Penjelasan:
- Pertama tama, dengan fungsi explode kita pecah tanggal berdasarkan tanda dash (-). Hasil pemecahan tersebut berupa array, selanjutnya, kita simpan array tersebut pada variabel
$split
. Contoh cara kerja fungsi explode: -
<?php $tanggal = '2016-03-20'; $split = explode('-', $tanggal); echo '<pre>'; print_r($split); /* Hasil: Array ( [0] => 2016 [1] => 03 [2] => 20 )*/
- Selanjutnya, dengan statemen
return
, kita kirim hasil ke pemanggil fungsi.Karena menggunakan 2 digit bulan, maka kita perlu mengubahnya menjadi satu digit, salah satunya dengan mengubah tipe datanya menjadi integer: dengan type casting (
(int) $split[1]
) atau bisa dengan perkalian (1 * $split[1]
)
Lebih lanjut:
- Tentang fungsi: Memahami Fungsi Pada PHP dan Cara Membuatnya
- Tentang statemen
return
pada fungsi: Memahami Statemen Return Pada PHP - Tentang array: Memahami Array Pada PHP
II. Format Tanggal Indonesia Dengan PHP – Menambahkan Nama Hari
Selanjutnya, pada kondisi tertentu kita perlu untuk menambahkan nama hari pada tanggal tersebut. Untuk keperluan tersebut, PHP juga telah menyediakan format karakternya, yaitu menggunakan l
(huruf kecil dari L), misal:
<?php
// Hari ini:
echo date('l, d F Y'); // Hasil: Saturday, 17 December 2016
Lagi lagi nama hari juga menggunakan bahasa Inggris, untuk mengubahnya ke dalam bahasa Indonesia, lagi lagi tidak ada cara lain kecuali kita menuliskan nama hari satu per satu.
Ide dasar script yang akan kita buat:
<?php
$hari = array ( 1 => 'Senin',
'Selasa',
'Rabu',
'Kamis',
'Jumat',
'Sabtu',
'Minggu'
);
// Misal hari ini adalah sabtu
echo date('N'); // Hasil 6
echo $hari[ date('N') ]; // Sama seperti echo $hari[6], hasil: Sabtu
// Contoh tanggal 20 Maret 2016 adalah hari Minggu
$num = date('N', strtotime('2016-03-20'));
echo $num; // Hasil 7
echo $hari[$num]; // Hasil: Minggu
Pada script diatas, kita menggunakan format N
untuk mendapatkan nomer urut dari hari yang dimulai dari 1 untuk Senin, dan terakhir 7 untuk Minggu.
Selanjutnya, mari kita perbarui fungsi tanggal_indo
sehingga dapat menampilkan nama hari:
<?php
function tanggal_indo($tanggal, $cetak_hari = false)
{
$hari = array ( 1 => 'Senin',
'Selasa',
'Rabu',
'Kamis',
'Jumat',
'Sabtu',
'Minggu'
);
$bulan = array (1 => 'Januari',
'Februari',
'Maret',
'April',
'Mei',
'Juni',
'Juli',
'Agustus',
'September',
'Oktober',
'November',
'Desember'
);
$split = explode('-', $tanggal);
$tgl_indo = $split[2] . ' ' . $bulan[ (int)$split[1] ] . ' ' . $split[0];
if ($cetak_hari) {
$num = date('N', strtotime($tanggal));
return $hari[$num] . ', ' . $tgl_indo;
}
return $tgl_indo;
}
echo tanggal_indo ('2016-03-20'); // Hasil: 20 Maret 2016;
echo tanggal_indo ('2016-03-20', true); // Hasil: Minggu, 20 Maret 2016
Pada contoh diatas, kita tambahkan argumen baru pada fungsi yaitu $cetak_hari
dengan nilai default false
. Argumen tersebut sebagai opsi apakah nantinya fungsi menghasilkan nama hari atau tidak.
III. Format Tanggal Indonesia Dengan PHP – Mengambil Data Dari Database
Dalam praktek, format tanggal Indonesia ini lebih sering digunakan ketika kita ingin menampilkan data tanggal dari database. Misal kita memiliki tabel artikel
dengan data sebagai berikut:
+------------+-------------------------------------+---------------------+ | id_artikel | judul_artikel | tanggal_terbit | +------------+-------------------------------------+---------------------+ | 1 | Format Tanggal Indonesia Dengan PHP | 2016-10-12 08:53:27 | | 2 | Memahami Return Pada PHP | 2016-11-10 11:22:20 | | 3 | Memahami Fungi Pada PHP | 2016-12-01 15:54:37 | +------------+-------------------------------------+---------------------+
Tabel tersebut berada di dalam database website
.
Selanjutnya, mari kita tampilkan data tersebut menggunakan format tanggal Bahasa Indonesia dengan menggunakan fungsi tanggal_indo
yang telah kita buat sebelumnya.
Script yang kita gunakan:
<?php
// FUNGSI
function tanggal_indo($tanggal, $cetak_hari = false)
{
$hari = array ( 1 => 'Senin',
'Selasa',
'Rabu',
'Kamis',
'Jumat',
'Sabtu',
'Minggu'
);
$bulan = array (1 => 'Januari',
'Februari',
'Maret',
'April',
'Mei',
'Juni',
'Juli',
'Agustus',
'September',
'Oktober',
'November',
'Desember'
);
$split = explode('-', $tanggal);
$tgl_indo = $split[2] . ' ' . $bulan[ (int)$split[1] ] . ' ' . $split[0];
if ($cetak_hari) {
$num = date('N', strtotime($tanggal));
return $hari[$num] . ', ' . $tgl_indo;
}
return $tgl_indo;
}
// AMBIL DATA DARI DATABASE
$con = @mysqli_connect('localhost', 'root', '', 'tutorial');
if (!$con) {
echo "Error: " . mysqli_connect_error();
exit();
}
$sql = 'SELECT * FROM artikel';
$query = mysqli_query($con, $sql);
// TAMPILKAN DATA
echo '<table>
<thead>
<tr>
<th>Judul Artikel</th>
<th>Tanggal Terbit</th>
</tr>
</thead>
<tbody>';
while ($row = mysqli_fetch_array($query))
{
// Ubah tanggal menjadi yyyy-mm-dd
$tanggal = date('Y-m-d', strtotime($row['tanggal_terbit']));
echo '<tr>
<td>' . $row['judul_artikel'] . '</td>
<td>' . tanggal_indo($tanggal, true) . '</td>
</tr>';
}
echo '</tbody>
</table>';
Hasil yang kita peroleh adalah:
Judul Artikel | Tanggal Terbit |
---|---|
Format Tanggal Indonesia Dengan PHP | Rabu, 12 Oktober 2016 |
Memahami Return Pada PHP | Kamis, 10 November 2016 |
Memahami Fungi Pada PHP | Kamis, 01 Desember 2016 |
Pada contoh diatas, karena format tanggal adalah date time, maka kita perlu ubah menjadi hanya date saja.
Untuk keperluan tersebut, ada beberapa cara yang dapat ditempuh, bisa menggunakan fungsi date seperti pada contoh diatas, bisa juga menggunakan fungsi explode untuk memecah tanggal berdasarkan spasi:
<?php
$split = explode(' ', $row['tanggal_terbit']);
$tanggal = $split[0];
IV. Cara Lebih Singkat
Terdapat cara yang lebih singkat untuk menulis tanggal dalam Bahsa Indonesia yaitu dengan mengeset localization menggunakan fungsi setlocale(), tetapi kita tidak bisa menggunakan fungsi date()
karena fungsi ini digunakan khusus untuk mencetak tanggal dalam bahasa Inggris. Fungsi yang dapat digunakan adalah strftime()
, misal:
setlocale(LC_ALL, 'id-ID', 'id_ID');
echo strftime("%A, %d %B %Y");
// Hasil: Selasa, 04 April 2020
echo strftime("%A, %d %B %Y", strtotime('2020-10-05')) . "\n";
// Hasil: Senin, 05 Oktober 2020
Untuk referensi lengkap fungsi strftime()
, bisa mengunjungi halaman manual fungsi ini: PHP strftime – Manual
Perlu diperhatikan bahwa pada fungsi setlocale()
, 'id-ID'
berjalan di Windows dan tidak bisa bekerja di Linux, jika menggunakan linux kita harus menggunakan 'id_ID'
, sehingga agar dapat berjalan di Windows dan Linux, kita gunakan keduanya.
Jadi apakah fungsi setlocale()
ini reliable atau handal disemua situasi? tergantung kondisi dilapangan. Lebih amannya, tulis code tersebut dalam fungsi tersendiri, misal kita buat fungsi fungsi format_tanggal(...) {...}
, sehingga jika terjadi perubahan, misal sebelumnya menggunakan fungsi strftime kemudian beralih ke date()
kita hanya perlu mengubah code yang ada di fungsi tersebut, tidak perlu di semua tempat.
Demikian pembahasan mengenai cara mengubah format tanggal Indonesia dengan PHP, semoga bermanfaat.
Salam…
Subscibe Now
Suka dengan artikel di Jagowebdev.com? jangan sampai ketinggalan, segera join ke milis kami untuk update informasi terbaru dari Jagowebdev.com
54 Feedback dari pembaca
thx tutorialnya gan
Sama sama mas
Mas, saya mau tanya tentang tipe data tanggal di MySQL. Saya berencana buat advanced search di halaman PHP, di mana ada kriteria pencarian rentang tanggal. Apakah saya harus set MySQL dengan tipe data “date” atau tetap dengan “string”? Karena ada artikel yg mengatakan lbh baik dgn tipe string karena format kolom tipe date di MySQL berbeda dengan PHP, jadi harus dikonversi lagi. Bila dengan string, apakah bisa ditemukan rentang tanggal tertentu? Terima kasih sebelumnya… sukses terus ya Mas!
Untuk mencari rentang tanggal, kedua tipe data tersebut bisa digunakan mas, maksudnya “format kolom tipe date di MySQL berbeda dengan PHP, jadi harus dikonversi lagi” apa ya mas?
Kalau saya pribadi lebih prefer menggunakan tipe data date mas, prinsip saya, gunakan tipe data yang disediakan sesuai dengan kegunaan, karena tiap tipe data akan dioptimasi sesuai dengan jenis data nya. Selain itu, dengan date dapat di pastikan bahwa format tanggal harus yyyy-mm-dd, jika dengan char, user bisa saja memasukkan data dengan format apapun. ruang penyimpanan date sebesar 8 byte, sedangkan char, untuk format yang sama adalah 10 byte
Sejujurnya saya juga kurang paham maksud kata “format kolom tipe date di MySQL berbeda dengan PHP, jadi harus dikonversi lagiâ€Â. Saya copas dari salah satu komentar yg sedang saya tunggu juga jawabannya. Terima kasih infonya ya Mas
sama sama mas
Oh iya Mas, saat ini project saya ada proses data import dari csv, dan format tanggal yg digunakan adalah d-M-y (contoh: 01-Jan-17), lalu saya mengubahnya dengan date(‘Y-m-d’, strtotime(’01-Jan-17′)), apakah ini bisa dapat langsung di simpan di MySQL dengan tipe data “date” atau harus saya konversi dengan Carbon ya Mas?
Itu sudah cukup mas, tinggal diimpor, format tangal sudah standar sql: date yyyy-mm-dd
nah nemu juga, puyeng pake locale IND, tanggalnya kebalik mulu. tq.
cakep gan, izin comot codenya buat dikembangkan lagi 😀
Silakan mas…
mas kalau misal 21 januari 2018 ataupun 21-01-2018 diubah menjadi 1801 bagaimana mas caranya
Itu format tanggal apa ya mas?
Saya mau bertanya, saya lagi membuat aplikasi berbasis web, dalam database saya ada 1 tabel yang mempunyai 2 kolom pencatatan tanggal.
Bagaimana cara agar 2 kolom tersebut menampilkan urutan tanggal bulan tahun yang sama seperti contoh III?
Sedangkan contoh yg ada di bagian III itu kan cuma ada 1 kolom pencatatan tanggal dalam 1 tabel.
Mohon penjelasannya, terimakasih.
Untuk mengurutkan berdasarkan 2 kolom, kita harus menentukan kolom mana yang akan diurutkan pertama kali baru kolom berikutnya, misal:
ORDER BY kolom_tgl1, kolom_tgl2
Berarti data akan diurutkan berdasarkan kolom
kolom_tgl1
, kemudian untuk nilaikolom_tgl1
yang sama, data akan diurutkan berdasarkankolom_tgl2
mas itu ko kalo saya inputnya tanggal sekarang knpa gabisa ya mas? kalo saya input tanggalnya kurang dari tgl sekarang baru bisa masuk
Ngga bisanya seperti apa ya mas?
Terima kasih, Mas…artikelnya sangat membantu
Sama sama mas…
Wah, terimakasih mas, saya sangat terbantu sekali (y) (y)
Sama sama mas….
kalau dibuat ke shortcode gimana mas?
Shortcode sama seperti fungsi mas…
mas kok saya error pas mau tambahkan “footer” ?
Error nya bagaimana mas?
mantap gan. sangat bermanfaat
gudangilmuaplikasi.com
Kenapa ya mas saat saya inputkan di data base 1999-25-07
Malah outputnya muncul 01 januari 1970
Tolong bantuan ny mas?
Coba dicek pakai database manager mas seperti phpmyadmin, jika sudah benar berarti script cetak tanggal nya yang bermasalah
pada script cetak tanggal bagaimana mengatasi salah nya mas pada bagian mana ????
Tergantung script cetak tanggalnya seperti apa mas
Terimakasih banyak gan sangat membantu, semoga sukses selalu!
Sama sama mas, terima kasih…
Wah, terimakasih bang, saya sangat terbantu sekali…
Sama sama mas…
terima kasih informasinya Pak. 🙂
Sama sama mas…
Trimakasih banyak mas.. Penjelasannya lengkap dan mudah dipahami.. Sangat membantu..
Sama sama mas… 🙂
Asslamu’alaikum mas
Mau tanya, kalau membuat kalimat selamat pagi secara otomatis berdasarkan waktu gimana ya mas?
Tinggal di buat kondisional if berdasarkan waktu mas, misal:
if (date(‘H:i:s’) > ’02:00:00′ && date(‘H:i:s’) < ’10:00:00′) {
echo ‘Selamat Pagi’;
}
Mau tanya bikin function tanggal indo nya dimana ya? Di helper bukan? Trus manggil function indo di mana nya?
Bebas mas, dimana mana bisa
mas mau ganti nama hari ke bahasa indonesia di worpress gimana ya
Coba pakai fungsi date_i18n mas
Mantap gan cara singkat lebih tokcer.. 😀
Terima kasih mas…
Makasih gan tutorialnya, btw maksudnya “array( 1 => …..)” angka 1nya itu untuk apa ya gan? kalo menurut saya itu artinya pertanda dimulai dari 1, karna biasanya array kan dari 0. Cuman takut salah pemahaman aja hehehe
Betul mas, index dimulai dari angka 1…
Keren, ilmu yang bermanfaat ,semoga dimudahkan rejekinya ,Amiin
Aamiin, terima kasih mas
Mau tanya jika format tanggal datetime agar tambil tanggal dan waktu nya bagaimana ya misal nya tampil 12 Agustus 2021 13:41:00.
Mohon pencerahannya
Terima Kasih
Perlu di split dulu mas antara tanggal dan waktunya, tanggalnya diformat dulu kemudian digabung dengan waktunya
Terimakasih banyak ilmunya, Kak. Sangat membantu
Sama sama mas