For English version from this entry, click here.
Halo! Kali ini, aku mau membahas tentang cara menyajikan waktu relatif.
Ketika ingin menyajikan data waktu, misal waktu pengiriman dan waktu terakhir diubah, biasanya kita menggunakan waktu relatif bersamaan dengan waktu absolut/mutlak. Apa bedanya?
Waktu absolut/mutlak adalah waktu yang didasarkan pada kejadian tertentu yang bersifat tetap (epoch). Misalnya, tahun 1 Masehi didasarkan pada kejadian kelahiran Nabi Isa a.s. Tahun 1 Hijriah didasarkan pada kejadian hijrah Nabi Muhammad saw. dari Makkah ke Madinah.
Waktu relatif adalah jarak waktu dari dua kejadian, biasanya dari suatu kejadian ke waktu saat ini. Misalnya, tulisan ini diterbitkan sekian menit yang lalu. Bulan Oktober akan tiba dalam 4 hari.
Salah satu keunggulan waktu relatif adalah tidak perlu memperhitungkan zona waktu saat memahami maksud dari tanggal/waktu yang ditampilkan. Misalnya, dalam konten-konten dengan target internasional, ditampilkan beberapa waktu dalam beberapa zona waktu untuk memudahkan para pembaca. Bila ada dukungan untuk pembaruan konten secara dinamis, banyak yang memilih untuk menampilkan hitung mundur juga selain waktu absolut/mutlak, salah satu cara menyajikan waktu relatif.
Cara Menyajikan Waktu Relatif
Ada banyak cara menyajikan waktu relatif. Sebagai contoh, yang ada di situs web atau aplikasi itu biasanya pakai satuan menit sebagai satuan terkecilnya. Selanjutnya adalah satuan jam, hari, pekan atau bulan, dan seterusnya. Satuan berikutnya dipakai setelah mencapai sebanyak satu satuannya, yaitu satuan jam setelah 60 menit, satuan hari setelah 24 jam, dan seterusnya.
Namun, ada juga cara lainnya. Untuk waktu relatif, aku lebih suka bila satuan berikutnya baru dipakai setelah mencapai sebanyak 1,5 atau 2 satuannya. Misalnya, satuan jam setelah 90 atau 120 menit, satuan hari setelah 36 atau 48 jam, dan seterusnya.
Selain itu, ada juga yang membulatkan ke bawah (floor), membulatkan ke atas (ceil), atau membulatkan ke terdekat (round). Aku memilih untuk membulatkan ke bawah.
Hanya saja, kebanyakan pustaka (library) yang ada itu (1) menggunakan batas satu satuan untuk berikutnya, (2) menggunakan batas-batas yang aneh menurutku, atau (3) membulatkan ke atas.
Oleh karena itu, kali ini, aku ingin membuat versiku sesuai keinginanku. Yang kuinginkan adalah versi yang menggunakan detik sebagai satuan terkecil, menggunakan satuan berikutnya setelah mencapai 2 satuannya, dan membulatkan ke bawah.
Fungsi Konversi Waktu Relatif
Aku akan menggunakan bahasa JavaScript. Salah satu alasannya adalah agar ini bisa dicoba langsung di halaman ini juga.
Berikut adalah definisi awal fungsi waktuRelatifID yang menerima dua parameter, yaitu waktu yang dimaksud dan acuan dalam menyajikan waktu relatif. Nilai acuan bersifat opsional dan bernilai bawaan waktu saat dipanggil.
function waktuRelatifID(waktu, acuan) {
if (acuan == undefined) {
acuan = new Date();
}
// Nilai beda dalam milidetik.
let beda = waktu.getTime() - acuan.getTime();
// ...
}
Nilai beda itu yang akan digunakan dalam menentukan yang akan ditampilkan.
Kasus pertama adalah bila nilai mutlak beda lebih kecil daripada satu satuan terkecil yang akan digunakan.
// Jika beda di bawah 1 detik,
if (Math.abs(beda) < 1000) {
return "sekarang";
}
Untuk selanjutnya, kita akan mengambil tanda dari beda. Setelah itu, kita buat beda menjadi selalu positif dengan fungsi nilai mutlak untuk memudahkan dalam menentukan satuan yang akan digunakan.
// Nilai beda negatif berarti kejadiannya lampau.
const lampau = beda < 0;
beda = Math.abs(beda); // Nilai mutlak
Bagian-bagian berikutnya berulang mengikuti satuan-satuan yang digunakan. Ada tiga bagian utama: (1) konversi beda ke satuan berikutnya, (2) pemeriksaan nilai 2 satuannya, dan (3) menyajikan berdasarkan lampau vs. tidak lampau.
beda /= 1000; // Milidetik ke detik
if (beda <= 2 * 60) {
return lampau ? // "yang lalu" vs. "dalam"
Math.floor(beda) + " detik yang lalu" :
"dalam " + Math.floor(beda) + " detik";
}
// Kode di atas diulangi untuk menit, jam, dan hari.
Berikut adalah kode lengkapnya.
// Waktu relatif dalam bahasa Indonesia
function waktuRelatifID(waktu, acuan) {
if (acuan == undefined) {
acuan = new Date();
}
// Nilai beda dalam milidetik.
let beda = waktu.getTime() - acuan.getTime();
// Jika beda di bawah 1 detik,
if (Math.abs(beda) < 1000) {
return "sekarang";
}
// Nilai beda negatif berarti kejadiannya lampau.
const lampau = beda < 0;
beda = Math.abs(beda); // Nilai mutlak
// Detik //
beda /= 1000; // Milidetik ke detik
if (beda <= 2 * 60) {
return lampau ?
Math.floor(beda) + " detik yang lalu" :
"dalam " + Math.floor(beda) + " detik";
}
// Menit //
beda /= 60; // Detik ke menit
if (beda <= 2 * 60) {
return lampau ?
Math.floor(beda) + " menit yang lalu" :
"dalam " + Math.floor(beda) + " menit";
}
// Jam //
beda /= 60; // Menit ke jam
if (beda <= 2 * 24) {
return lampau ?
Math.floor(beda) + " jam yang lalu" :
"dalam " + Math.floor(beda) + " jam";
}
// Hari //
beda /= 24; // Jam ke hari
return lampau ?
Math.floor(beda) + " hari yang lalu" :
"dalam " + Math.floor(beda) + " hari";
}
Contoh hasilnya: Tulisan ini diterbitkan kapan?
Penutup
Meskipun bisa membuat fungsi relatif sendiri, kita belum tentu bisa menerapkannya untuk aplikasi yang dibuat oleh pihak lain. Oleh karena itu, aku berharap bahwa tiap aplikasi memiliki cara tertentu untuk bisa melihat waktu absolut/mutlak selain melihat waktu relatif.
Pada dasarnya, aku lebih memilih bisa melihat nilai pasti daripada perkiraan jika memungkinkan. Blog ini pun juga memilih untuk menyajikan waktu penerbitan dengan waktu absolut/mutlak. Waktu relatif yang banyak disajikan itu biasanya kehilangan presisinya. Misalnya, waktu absolut/mutlak biasanya memiliki presisi hingga detik, sedangkan waktu relatif pada umumnya makin kurang presisi seiring waktu (menit yang lalu, jam yang lalu, dst.).
Cukup sekian tulisanku kali ini. Semoga bermanfaat!
Tidak ada komentar:
Posting Komentar