如何检查double值是在java 6中的Date类型

时间:2018-02-23 06:51:39

标签: java excel datetime apache-poi

我正在尝试解析在其单元格中有日期的excel表。但是当我的代码解析它将日期转换为双重即42921,43098时,我必须将该双重解析为日期以便我也可以获得正确的输出。我也必须维护代码只与java 6兼容。我正在使用poi 3.6。所以我试过的是下面的,

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;
}

我正在尝试使用isValidExcelDate(double value)来检查数字的类型是日期,但是它也在考虑其他双重值作为日期,这个cheking不起作用。任何人都对此有任何想法?请帮忙。

2 个答案:

答案 0 :(得分:1)

“将日期转换为double

Excel中的日期本身存储为double值,即自18/31/1899以来的天数(或Excel称之为1900年1月0日)。一天中的时间被编码为小数部分。

如果要以字符串形式访问日期,请读取单元格的字符串值,而不是数值。但是,您将获得用户指定的格式化值,这可能是一系列不同的格式。

  

//here i am trying to check the double is of type 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值和原始单元格的格式。一种方法是修改方法的签名以添加“格式”参数,并让调用者传递单元格格式。

答案 1 :(得分:0)

Date date = DateUtil.getJavaDate(Double.parseDouble(formattedValue));
String dateTime =  new SimpleDateFormat("dd.MM.yyyy HH:mm:ss").format(date);`