发现问题的背景是这样的:要开发一个excel上传工单,使用POI解析工单,获取其中信息的一个功能,其中有一项是加工时间在excel中格式是[h]:mm:ss,是一种自定义格式,转换为时间格式是1900/1/1 22:07:30
出现的问题是,我要获取这个加工时间使用的java代码是:
Date date = cell.getDateCellValue();
//或
Date date = HSSFDateUtil.getJavaDate(cell.getNumericCellValue());
res = new SimpleDateFormat("h:mm:ss").format(date);
这两种方式的效果都是一样的,java获取的时间值是:10:07:30,显然获取的是不正确的。为什么会这样呢,这是跟excel日期格式有关。
我百度了下说是一般时间都是从1900-01-01开始,于是我开始尝试计算1900-01-01 与date 的差值,但是差别更大居然内获取到22:01的时间,我也是醉了。最后通过尝试,得出了一个很有意思的问题,很多日历都是从1901年开始展示的,之前的就没有了,不知道为何。
我通过测试,实现的方式是,给年份加上1000年,然后再取差值,取到的数据是符合excel里的值的,但是有点不明白的是为什么是1900,0,0,而不是1900,0,1,如果日为1,则比excel差24小时
public static String getDiffer1900(Date endTime) {
Calendar calendar = new GregorianCalendar(1900,0,0);
calendar.add(Calendar.YEAR, 1000);
Date date = calendar.getTime();
Calendar cc = Calendar.getInstance();
cc.setTime(endTime);
cc.add(Calendar.YEAR, 1000);
long diff = cc.getTime().getTime() - date.getTime();
diff = diff < 0? -diff:diff;
long nd = 1000 * 24 * 60 * 60;
long nh = 1000 * 60 * 60;
long nm = 1000 * 60;
long ns = 1000;
// 计算差多少小时
long hour = diff / nh;
// 计算差多少分钟
long min = diff % nd % nh / nm;
// 计算差多少秒//输出结果
long sec = diff % nd % nh % nm / ns;
return hour + ":" + min + ":" + sec;
}
比如 endTime = ‘1900-01-01 22:07:30’,则获取到的加工时间为:46:7:30,与excel的相符