为什么JXL会给我一个前一天的约会?

时间:2014-01-13 15:36:48

标签: date groovy jxl

我正在使用JXL和Groovy阅读Excel电子表格,如下所示:

WorkbookSettings settings = new WorkbookSettings();
settings.encoding = "Cp1252"
settings.locale = new Locale("pt", "BR")
Workbook workbook = Workbook.getWorkbook(is, settings)
Sheet sheet = workbook.getSheet(0)

然后我在Excel中有一个单元格,其值为 09/01/2013 (dd / mm / yyyy)。但是,当我检索单元格内容时,JXL会自动进行一些转换并将其返回给我:

"09/01/13" == sheet.getCell(col, line).contents?.trim()

但是,当我将Cell转换为DateCell时,“09/01/13”的日期表示形成为2013年1月8日(!):

DateCell dc = ((DateCell) sheet.getCell(col, line))
println "date from JXL: ${dc.date}" // prints Tue Jan 08 22:00:00 BRST 2013

有人会对如何解决此问题有任何想法吗?如果我可以直接检索实际的单元格内容(09/01/2013),那么我可以自己完成所有转换内容。

谢谢!

1 个答案:

答案 0 :(得分:1)

来自:http://www.andykhan.com/jexcelapi/tutorial.html#dates

  

显示日期时,java.util包会自动调整本地时区。这可能会导致在应用程序中显示日期时出现问题,因为日期看起来好像是存储在Excel电子表格中的日期之前的一天,尽管实际情况并非如此。

     

...

     

解决此问题的最简单方法(以及jxl.DateCell的getContents()方法在内部使用的方法)是强制日期格式的时区如下:

TimeZone gmtZone = TimeZone.getTimeZone("GMT");
SimpleDateFormat format = new SimpleDateFormat("dd MMM yyyy");
format.setTimeZone(gmtZone);

DateCell dateCell = .... 
String dateString = format.format(dateCell.getDate());