Validasi tanggal lahir terlihat seperti pekerjaan sepele karena tanggal hanya terdiri dari tiga angka. Kenyataannya justru di sinilah kesalahan kecil paling sering lolos sampai produksi: seseorang yang berulang tahun hari ini ditolak sistem, atau seseorang yang belum cukup umur diloloskan karena selisih satu hari. Tulisan ini mengumpulkan kasus batas yang benar-benar muncul di lapangan dan menunjukkan cara mengujinya.
Tahun kabisat dan tanggal dua puluh sembilan Februari
Aturan tahun kabisat pada kalender Masehi bukan sekadar setiap empat tahun. Tahun yang habis dibagi empat adalah kabisat, tetapi tahun yang menutup abad hanya kabisat bila habis dibagi empat ratus. Karena aturan itu, tahun seribu sembilan ratus bukan tahun kabisat, sedangkan tahun dua ribu adalah tahun kabisat. Sistem yang hanya memeriksa pembagian empat akan menerima tanggal yang tidak pernah ada.
| Tahun | Habis dibagi empat | Habis dibagi seratus | Habis dibagi empat ratus | Kabisat |
|---|---|---|---|---|
| Seribu sembilan ratus | ya | ya | tidak | tidak |
| Dua ribu | ya | ya | ya | ya |
| Dua ribu empat | ya | tidak | tidak | ya |
Kesalahan berikutnya muncul pada tanggal dua puluh sembilan Februari. Orang yang lahir pada tanggal itu benar-benar ada, dan sistem yang menolak tanggal tersebut sebagai tidak valid akan menutup pintu bagi mereka. Kesulitan sesungguhnya bukan pada saat mengisi formulir, melainkan pada saat menghitung usia atau memilih tanggal ulang tahun untuk pengingat, karena tanggal itu tidak ada di sebagian besar tahun.
Bagaimana usia dihitung, dan apakah hari ulang tahun dihitung penuh?
Cara yang paling banyak dipakai adalah menghitung selisih tahun antara hari ini dan tanggal lahir, lalu mengurangi satu bila tanggal ulang tahun pada tahun berjalan belum terlewati. Dengan cara ini, seseorang dianggap genap berusia tertentu tepat pada hari ulang tahunnya, bukan sehari sesudahnya. Dua aturan yang tampak mirip ini menghasilkan jawaban berbeda untuk satu hari dalam setahun, dan satu hari itu cukup untuk membuat keluhan pengguna.
Karena itu, pertanyaan pertama yang harus Anda jawab bukanlah bagaimana rumusnya, melainkan aturan mana yang berlaku bagi produk Anda. Bila usia dipakai untuk menentukan akses ke layanan, tuliskan aturannya secara eksplisit dan uji tepat di batasnya, bukan hanya jauh di dalam rentang yang aman.
Zona waktu dan arti kata hari ini
Kata hari ini tidak menunjuk saat yang sama di semua tempat. Ketika tengah malam baru tiba di Jakarta, tanggal di Los Angeles masih kemarin. Bila server Anda menghitung usia memakai zona waktunya sendiri, pengguna yang berulang tahun hari ini bisa ditolak selama beberapa jam setiap tahun, dan kegagalan itu akan hilang begitu diuji ulang besoknya.
Perbaikan yang lazim adalah menghitung usia dalam zona waktu pengguna, atau lebih tepat lagi, menyimpan tanggal lahir sebagai tanggal tanpa jam sama sekali. Tanggal lahir hanya perlu memiliki tahun, bulan, dan hari; menambahkan jam dan zona waktu ke dalamnya justru menciptakan masalah yang tidak perlu.
Apakah semua orang memakai kalender yang sama?
Tidak. Kalender Masehi adalah yang paling luas dipakai dalam administrasi modern, tetapi beberapa negara memakai kalender lain untuk keperluan sipil maupun keagamaan, misalnya kalender Ethiopia, Nepal, dan Iran. Tanggal yang sama bisa ditulis dengan angka tahun yang berbeda jauh, dan selisihnya tidak tetap sepanjang tahun karena awal tahunnya bergeser.
Akibat praktisnya, jangan menganggap angka tahun yang kecil sebagai masukan yang salah. Pengguna yang mengetik tahun menurut kalender setempat bisa tampak berusia sangat tua atau bahkan belum lahir bila nilainya ditafsirkan langsung sebagai kalender Masehi. Cara yang paling aman adalah menyatakan kalender yang dipakai pada label kolomnya, dan bila memungkinkan, gunakan pemilih tanggal alih-alih kebebasan mengetik angka.
Kesalahan lain yang berasal dari kebiasaan lama adalah memakai tanggal lahir sebagai pertanyaan keamanan atau nomor konfirmasi di layanan telepon. Kebiasaan itu membuat tanggal lahir berubah fungsi dari keterangan administratif menjadi rahasia, padahal nilainya bukan rahasia sama sekali dan mudah ditemukan. Untuk pengujian, jangan pernah memakai data lahir orang nyata sebagai isian contoh. Data yang dihasilkan situs ini hanya untuk pengujian dan tidak boleh dipakai untuk menyamar sebagai orang lain; tidak ada catatan yang sengaja dirancang agar lolos verifikasi usia, pembukaan rekening, atau pemeriksaan identitas sungguhan. Nilai seperti itu dipakai untuk memastikan sistem Anda menerima dan menolak masukan dengan benar, bukan untuk melewati pemeriksaan apa pun.
Satu lagi yang sering luput: jangan mencetak tanggal lahir lengkap di catatan sistem. Bila sebuah proses memang perlu menandai pengguna, gunakan penanda yang tidak dapat dibaca kembali menjadi tanggal.
Bagaimana tanggal lahir dimasukkan ke formulir?
Beberapa kesalahan yang paling sering terulang sebenarnya terjadi di antarmuka, bukan di pemeriksaan data.
- Kolom teks bebas yang menerima berbagai format penulisan, sehingga pengguna mengetik urutan bulan dan tanggal yang berbeda dari yang diharapkan.
- Pemilih tanggal tiga daftar menurun yang mengurutkan bulan menurut abjad, bukan menurut urutan dalam setahun.
- Batas tanggal yang salah pada pemilih, misalnya tidak mengizinkan tanggal masa depan tetapi juga menolak tahun yang sangat tua yang sah.
- Ganti bahasa yang mengubah format tampilan, sementara nilai yang tersimpan tetap ditafsirkan dengan format semula.
- Kolom wajib yang menolak tanggal kosong, padahal sebagian pengguna memang tidak mengetahui tanggal lahirnya secara pasti.
Apakah tanggal lahir selalu perlu ditanyakan?
Tidak, dan menanyakannya tanpa alasan yang jelas justru menimbulkan tanggung jawab. Tanggal lahir termasuk data pribadi, sehingga prinsip pengumpulan seperlunya berlaku: minta hanya bila benar-benar dipakai untuk sesuatu, misalnya menentukan batas usia atau menyesuaikan isi layanan.
Sering kali kebutuhan yang sebenarnya bukan tanggal, melainkan sekadar jawaban atas satu pertanyaan, apakah pengguna sudah melewati usia tertentu. Untuk keperluan itu, menanyakan hal yang lebih ringan bisa lebih tepat, tergantung aturan yang berlaku di layanan Anda. Yang perlu dihindari adalah mengumpulkan tanggal lengkap lalu menyimpannya tanpa dipakai, karena data yang tidak dipakai tetap harus dijaga.
Pastikan juga alasan pengumpulan itu tercermin di label kolom. Pengguna lebih kooperatif bila tahu mengapa sebuah keterangan diminta, dan petugas dukungan Anda punya jawaban siap ketika ada yang bertanya.
Untuk pengembang: simpan sebagai tanggal, hitung per hari
Simpan tanggal lahir sebagai tanggal tanpa waktu dan tanpa zona waktu, karena menambahkan keduanya hanya menciptakan pertanyaan yang tidak perlu dijawab. Untuk perhitungan, bandingkan ketiga komponen tanggal satu per satu, bukan dengan mengurangi cap waktu, karena pengurangan cap waktu memasukkan jam, menit, dan detik ke dalam hitungan yang seharusnya hanya sampai hari.
Siapkan empat kasus uji pada setiap ambang usia: sehari sebelum cukup umur, tepat pada hari ulang tahun, sehari sesudahnya, dan sehari setelah tahun kabisat. Jalankan keempatnya pada dua zona waktu yang berbeda agar kesalahan akibat perbedaan tanggal benar-benar terlihat. Jangan lupa satu kasus dengan tahun lahir yang tidak masuk akal, untuk memastikan sistem menolaknya dengan pesan yang jelas.
Bila produk Anda punya ambang usia, simpan angkanya di satu tempat sebagai nilai yang bisa diubah, bukan tersebar di banyak pemeriksaan. Untuk melengkapi catatan uji, generator data identitas di situs ini dapat menghasilkan tanggal lahir yang wajar bersama bidang lain, dan catatan tentang batas usia membahas sisi kebijakannya.
Perhatikan juga hubungan tanggal lahir dengan bidang lain. Bila Anda menyimpan sekaligus tanggal lahir, usia, dan tahun lahir, ketiganya harus selalu konsisten; cara paling aman adalah menyimpan tanggal lahir saja dan menghitung sisanya saat dibutuhkan. Pasangan bidang yang saling bergantung seperti ini dibahas lebih jauh pada uraian tentang keselarasan data identitas.
Langkah berikutnya
Ambil satu ambang usia yang dipakai produk Anda, lalu tulis empat tanggal uji di sekitarnya dan jalankan semuanya pada dua zona waktu. Bila ada satu saja yang memberi jawaban berbeda dari yang Anda harapkan, perbaiki aturan hitungannya sebelum menambah fitur lain di atasnya.