JXL获取Excel单元格的日期(DateCell.getDate)与实际填写日期相差8小时的解决方法(转)

转自http://blog.chiefleo.me/archives/477

 

 

用JXL获取的时间总是比Excel单元格实际填写的时间早八小时,例如
单元格中日期为“2009-9-10″,getDate得到的日期是“Thu Sep 10 08:00:00 CST 2009″
单元格中日期为“2009-9-10 16:00:00″,getDate 得到的日期便是“Fri Sep 11 00:00:00 CST 2009″;

这种问题产生的原因 是JXL按照GMT时间来解析Excel单元格的时间,它始终认为被解析的单元格填写的时间 为格林威治时间,然后我们在本地getDate的时候会将格林威治时间转成本地时间,因此会相差8小时。
详见:jxl.read.biff.DateRecord.java类

1
private static final TimeZone gmtZone = TimeZone.getTimeZone("GMT");

gmtZone为final的,我们不能通过setTimeZone这种方法来改 变时区,只能在JXL获取时间以后重新转成本地时间。
测试开始:
1、首先在D盘建立一个xls表(tests.xls),在A1单元格随便填写一个日期,例如2010-4-11 0:00:00
2、测试类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import java.io.File;
import java.io.IOException;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Locale;
import java.util.TimeZone;
import jxl.DateCell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;
 
public class JXLTest {
	public static void main(String[] args) throws BiffException, IOException,ParseException {
		Workbook workBook = Workbook.getWorkbook(new File("D://test.xls"));
		Sheet sheet = workBook.getSheet(0);
		DateCell cell = (DateCell) sheet.getCell(0, 0);
		System.out.println("Get date by JXL:" + cell.getDate());
		System.out.println("After converting,we can get the time we had writed-->"+ convertDate4JXL(cell.getDate()));
	}
 
	/**
	 * JXL中通过DateCell.getDate()获取单元格中的时间为(实际填写日期+8小时),原因是JXL是按照GMT时区来解析XML。
	 * 本方法用于获取单元格中实际填写的日期! 例如单元格中日期为“2009-9-10”,getDate得到的日期便是“Thu Sep 10 08:00:00 CST 2009”;
	 * 单元格中日期为“2009-9-10 16:00:00”,getDate得到的日期便是“Fri Sep 11 00:00:00 CST 2009”
	 * @author XHY
	 * @param jxlDate 通过DateCell.getDate()获取的时间
	 * @return
	 * @throws ParseException
	 */
	public static java.util.Date convertDate4JXL(java.util.Date jxlDate) throws ParseException {
		if (jxlDate == null)
			return null;
		TimeZone gmt = TimeZone.getTimeZone("GMT");
		DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss",Locale.getDefault());
		dateFormat.setTimeZone(gmt);
		String str = dateFormat.format(jxlDate);
		TimeZone local = TimeZone.getDefault();
		dateFormat.setTimeZone(local);
		return dateFormat.parse(str);
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值