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日期