excel中日期转成java_POI-在Excel和Java日期之间转换时出现问题,反之亦然

Excel

1900日期系统中的日期值从1900年1月的值0=第0天开始。没有

在此之前的日期值。

如果有下列单元格

:

A B

1 Value Excel date

2 0 01/00/1900 00:00:00

3 0.5 01/00/1900 12:00:00

4 1 01/01/1900 00:00:00

5 1.5 01/01/1900 12:00:00

其中列中的值

B

与列中的值相同

A

但用数字格式格式化为日期

MM/DD/YYYY hh:mm:ss

,你看。

擅长

日期1899年12月31日。这就是为什么

DateUtil.getExcelDate(date)

失败时

date

Java

日期

Sun Dec 31 00:00:00 GMT 1899

Sun Dec 31 12:00:00 GMT 1899

.

但是

DateUtil.getJavaDate(excelDate)

返回1899年12月31日

excelDate

是一个

double

价值来源

0.0

0.999...

. 那是因为没有

日期可能是1900年1月0日。但是有

日期值可能来自

.

擅长

日期值来自

0.0分

0.999。。。

是现实中的时间价值

之前

第一个可能的一整天

擅长

,日期是1900年1月1日。它们不是真的在一天之内,而是在第0天。

起始日期值

0.0分

0.999。。。

爪哇

通过扩展代码:

import java.util.Date;

import java.util.Calendar;

import java.util.stream.DoubleStream;

import org.apache.poi.ss.usermodel.DateUtil;

public class POIQuery {

public static void main(final String[] args) {

final String format = "%-20s%-35s%-20s%n"; //$NON-NLS-1$

System.out.format(format, "Input Excel Date", "Java Date", "Converted Excel Date");

DoubleStream.of(0, 0.5d, 1d, 1.5d, 44000d, 44000.5d).forEach(excelDate -> {

final Date date = DateUtil.getJavaDate(excelDate);

Calendar cal = Calendar.getInstance();

cal.setTime(date);

double excelDateFromDate = -1d;

if (cal.get(Calendar.YEAR) == 1899 && cal.get(Calendar.MONTH) == 11 && cal.get(Calendar.DATE) == 31) {

cal.add(Calendar.DATE, 1);

excelDateFromDate = DateUtil.getExcelDate(cal.getTime());

excelDateFromDate -= 1d;

} else {

excelDateFromDate = DateUtil.getExcelDate(date);

}

System.out.format(format, excelDate, date, excelDateFromDate);

});

}

}

爪哇

日期是1899年12月31日,我们知道这是从

擅长

擅长

日期值,使用前一天先添加

DateUtil.getExcelDate

DateUtil.getExcelDate日期

从1900年1月1日起皈依。然后减去

1

DateUtil.getExcelDate日期

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值