Keanehan DateTime Di DbUnit + Excel


Saya menemukan sebuah kejanggalan saat melakukan pengujian dengan memanfaatkan DbUnit.  Pada sebuah sheet Excel, saya memiliki sebuah kolom yang telah saya format sebagai “dd/mm/yyyy hh:mm”.   Berikut ini adalah contoh nilai kolom tersebut:

Data Di Excel

Data Di Excel

Anehnya, pada saat masuk ke database, nilai kolom waktu_yang_ditentukan malah berubah menjadi:

Nilai Yang Masuk Ke Database

Nilai Yang Masuk Ke Database

Keanehan yang terjadi adalah setiap jam selalu ditambah +7 jam!  Saya yakin ini bukan kesalahan kode program yang diuji, melainkan disebabkan oleh DbUnit.

Setelah membongkar kode program DbUnit, akhirnya saya menemukan bagian yang menarik di class org.dbunit.dataset.excel.XlsTable.  Berikut ini adalah penggalan kode program di method getDateValue(HSSFCell cell) untuk class tersebut:

protected Object getDateValue(HSSFCell cell) 
{
   logger.debug("getDateValue(cell={}) - start", cell);

   double numericValue = cell.getNumericCellValue();
   Date date = HSSFDateUtil.getJavaDate(numericValue);
   // Add the timezone offset again because it was subtracted automatically by Apache-POI (we need UTC)
   long tzOffset = TimeZone.getDefault().getOffset(date.getTime());
   date = new Date(date.getTime() + tzOffset);
   return new Long(date.getTime());

   //TODO use a calendar for XLS Date objects when it is supported better by POI
   //        HSSFCellStyle style = cell.getCellStyle();
   //        HSSFDataFormatter formatter = new HSSFDataFormatter();
   //        Format f = formatter.createFormat(cell);
   //      String formatted = fomatter.formatCellValue(cell);
   //System.out.println("###"+formatted);
   //        Date dateValue = cell.getDateCellValue();
}

Ternyata DbUnit akan secara otomatis menambah nilai yang ada di kolom tanggal dengan time zone sistem operasi.   Saya tidak tahu apa tujuannya, tetapi saya tidak menemukan cara untuk menentukan timezone di sebuah kolom dengan format date time di Microsoft Excel.  Tidak ada jalan keluar yang lebih mudah selain menghapus bagian yang menambah timezone sehingga kode program di atas akan terlihat seperti:

protected Object getDateValue(HSSFCell cell) 
{
   logger.debug("getDateValue(cell={}) - start", cell);
   double numericValue = cell.getNumericCellValue();
   Date date = HSSFDateUtil.getJavaDate(numericValue);
   return new Long(date.getTime());
}

Karena saya memakai Maven, saya membuat sebuah proyek Maven baru untuk DbUnit yang hasil modifikasi (tidak original lagi).  Langkah-langkah yang saya tempuh dapat dilihat di tulisan Membuat Proyek Maven “Lokal” Untuk Disertakan Pada Proyek Lain.

Bagi yang tidak memakai Maven, dapat men-download file JAR untuk DbUnit yang telah dimodifikasi di https://docs.google.com/open?id=0B-_rVDnaVRCbenA3NkdrdUdIYmc.

Perihal Solid Snake
I'm nothing...

Apa komentar Anda?

Please log in using one of these methods to post your comment:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: