java使用POI解析excel时碰到1900年日期格式造成的取时间不准确问题

发现问题的背景是这样的:要开发一个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的相符

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值