Delphi SecondsBetween Bugs?

Ada sebuah kasus teknis (programming) dalam hal ini adalah Delphi (versi 7, ntahlah di versi-versi yang lain). Tujuannya adalah menghitung selisih waktu detik antara dua buah satuan waktu.

Waktu awal: 2010/02/15 13:51:34, waktu akhir: 2010/02/15 13:51:21.

Secara kasat mata atau perhitungan manual kita tahu bahwa selisih waktu awal dan waktu akhir adalah 13 detik. Tapi coba hitunglah selisih waktu di atas dengan menggunakan sebuah fungsi di Delphi yang dikhususkan untuk menghitung selisih waktu dalam satuan detik. SecondsBetween.

Hasilnya adalah sebuah angka yang tidak sesuai dengan harapan, yaitu 12 detik.

Namun untuk beberapa kasus, fungsi SecondsBetween memberikan nilai perhitungan yang benar seperti untuk data input:

Waktu awal: 2010/02/15 16:50:13, waktu akhir: 2010/02/15 16:50:14. Hasilnya adalah 1 detik.

Dan pada akhirnya sampai pada pertanyaan mendasar: kenapa begitu?

Adakah bugs dalam fungsi SecondsBetween?

Saya sendiri masih belum menemukan rujukan online terkait temuan ini di internet atau forum Delphi (yang saya tau 😀 ) tapi yang jelas hal ini adalah sebuah kesalahan mendasar yang seharusnya tidak terjadi.

Lalu solusinya?

Oke, pertama-tama ada beberapa opsi yang saya yakin, jika anda menjadi saya anda pasti akan memilih opsi yang sama. Yaitu:

  1. Membuat fungsi baru dengan tujuan yang sama
  2. Menelusuri penyebab error tersebut, dan melakukan patch

Saya memilih opsi kedua, menelusuri penyebab error tersebut. Dan syukurlah jawabannya dapat segera ditemukan dengan melihat isi dari fungsi tersebut.

Ada yang salah? ya.. ternyata si Borland menggunakan fungsi Trunc untuk melakukan konversi dari Double menjadi Int64. Sehingga menyebabkan untuk beberapa nilai selisih tanggal yang dalam delphi merupakan bentukan dari Double akan dibulatkan mendekati nol.

Sebagai solusinya adalah rubah fungsi SecondsBetween yang terdapat dalam unit DateUtils menjadi:

Dan masalah terselesaikan.

Mudah-mudahan kasus yang saya jumpai ini dapat menjadi bahan pembelajaran bagi semuanya. Btw, untuk detil mengenai kegunakan fungsi Round silakan baca sendiri saja di dokumentasi help Delphi 😀