如何在Java6中检查日期类型的双精度值
我试图解析单元格中包含日期的excel工作表。但当我的代码解析时,它将日期转换为双精度,即4292143098,我必须将该双精度解析回日期,以便获得正确的输出。此外,我还必须保持代码仅与java 6兼容。我使用的是poi 3.6。因此,我尝试了以下内容如何在Java6中检查日期类型的双精度值,java,excel,datetime,apache-poi,Java,Excel,Datetime,Apache Poi,我试图解析单元格中包含日期的excel工作表。但当我的代码解析时,它将日期转换为双精度,即4292143098,我必须将该双精度解析回日期,以便获得正确的输出。此外,我还必须保持代码仅与java 6兼容。我使用的是poi 3.6。因此,我尝试了以下内容 private String formatDoubleNumberToString(double number) { String formattedNumber = NumberToTextConverter.toText(number
private String formatDoubleNumberToString(double number) {
String formattedNumber = NumberToTextConverter.toText(number);
// replace E notation format
if (formattedNumber.contains("E")) {
formattedNumber = String.format("%." + DECIMAL_PLACES + "f", number);
formattedNumber = formattedNumber.indexOf(DECIMAL_SEPARATOR) < 0 ? formattedNumber
: formattedNumber.replaceAll("0*$", "").replaceAll("\\" + DECIMAL_SEPARATOR + "$", "");
}
else if(DateUtil.isValidExcelDate(double number)){ //here i am trying to check the double is of type Date
// convert the date using simpleDateFormat
}
return formattedNumber;
}
专用字符串格式DoubleNumberToString(双倍数字){
字符串formattedNumber=NumberToTextConverter.toText(数字);
//替换E符号格式
if(formattedNumber.contains(“E”)){
formattedNumber=String.format(“%。”+小数点+f”,数字);
formattedNumber=formattedNumber.indexOf(十进制分隔符)<0?formattedNumber
:formattedNumber.replaceAll(“0*$”,“”)。replaceAll(“\\\”+十进制分隔符+“$”,“”);
}
else if(DateUtil.isValidExcelDate(double number)){//这里我试图检查double的类型是Date
//使用SimpleDataFormat转换日期
}
返回格式化的数字;
}
我试图使用isValidExcelDate(双值)检查数字是否为日期类型,但它也考虑使用其他双值作为日期,并且此检查不起作用。有人知道这一点吗?请帮助。这不是“将日期转换为双倍日期”
Excel中的日期本机存储为double
值,即自1899年12月31日(或Excel称之为1900年1月0日)以来的天数。一天中的时间被编码为小数部分
如果要以字符串形式访问日期,请读取单元格的字符串值,而不是数值。但是,您将获得用户指定的格式的值,这可能是一系列不同的格式
//我在这里试图检查double的类型是Date
所有正的double
值都是“有效日期”,因为Excel将根据自Excel的“历元”(起点)起的天数将其转换为日期。以下是一些例子:
Number Date
-------- ------------
0 1/0/1900
365 12/30/1900
10000 5/18/1927
100000 10/14/2173
1000000 11/26/4637
10000000 ############
所以从1900年起100万天是有效的,但1000万天超出范围。还要注意,Excel不能处理带有负值的日期值,即“1900年1月0日”之前的日期值
至于您正在查看的单元格是否包含日期,除了检查单元格的存储格式外,您无法真正确定。如果单元格的格式为“日期”,则用户可能希望该值为日期,但这不是100%确定的。要回答所问的问题,您不能检查double值并判断它是否是日期
代码中的方法只有一个
double
参数,因此无法确定源单元格的原始格式。您需要访问double
值和原始单元格的格式。一种方法是修改方法的签名以添加“format”参数,并让调用者传递单元格格式。要确定Excel单元格中的数字是否为日期,必须获取该单元格的格式。如果单元格是日期格式,则它是日期;如果单元格不是日期格式,则它不是日期。没有其他可能性。使用中所示的DataFormatter
是此问题的最佳解决方案。的变体。您能告诉我在else条件下如何确定它吗?在只有double
作为参数的方法中,您不能这样做。您必须检查实际的单元格格式,这意味着您需要访问单元格
对象。请参阅单元格的POI Javadoc以确定格式。
Date date = DateUtil.getJavaDate(Double.parseDouble(formattedValue));
String dateTime = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss").format(date);`