将Excel时间戳转换为java.sql.date

时间:2015-06-15 12:39:19

标签: java excel

我正在从Excel(2010)中提取时间戳:

显示为“10.06.2015 14:24”。 excel的“内部表示”是“42165.6”。最后一个是从Excel输出的。

所以,现在,我想将这个时间戳解析为这样的Java程序:

double input = 42165.6;
// long myLong = ???
SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy HH:mm");
System.out.println(sdf.format(new java.sql.Date(myLong)));

我怎样才能在第2行做到这一点?!

非常感谢你的帮助!!!

亲切的问候

3 个答案:

答案 0 :(得分:2)

Excel将日期存储为自1900年1月以来的天数。这使得转换为Java日期(自1970年1月1日以来的毫秒数)变得尴尬。如果您无法以可读格式导出它,则需要创建Java日历,将其设置为1900年1月1日,并添加天数。

这是:

    double excelDate = 42165.6;
    int days = (int) excelDate;  //number of days
    int seconds = (int) ((excelDate-days) * 86400);  //number of seconds in .6 days

    //create calendar set to 01-Jan-1900
    Calendar cal = Calendar.getInstance();
    cal.set(Calendar.YEAR, 1900);
    cal.set(Calendar.MONTH, 0);
    cal.set(Calendar.DAY_OF_MONTH, 1);

    //Add days and seconds to get required date/time
    cal.add(Calendar.DATE, days-1);
    cal.add(Calendar.SECOND, seconds);

    //cal.getTime() returns a java.util.Date, print it out...
    System.out.println(cal.getTime());

请注意 可以从java.sql.Date创建java.util.Date,如下所示:

java.util.Date utilDate = ....
java.sql.Date sqlDate = new java.sql.Date(utilDate.getTime());

答案 1 :(得分:1)

The fastest way to get from the excel notation to a java.sql.Date is:

    double excelInput = 42165.6;
    SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy HH:mm");
    System.out.println("---> "
            + sdf.format(new java.sql.Date(
                    (long) ((excelInput - 25569) * 86400 * 1000))));

Excel stores a date since 01-01-1900, java.sql.date since 01-01-1970. There are exactly 25569 days difference between both dates. The constructor of java.sql.Date wants the milliseconds (!) since 01-01-1970, so with "* 86400" we get the seconds and then with (* 1000) the milliseconds.

That's it! ;)

答案 2 :(得分:0)

将42165.6放在Excel中并格式化为日期会给出正确的日期6/10/15 14:24

对我来说,mrbela和NickJ的回答都对42165.6,06/10/2015 09:2306/12/2015 03:25的问题给出了错误的答案。对于我尝试过的大多数例子来说,这似乎都是正确的。

对我有用的解决方案是使用Apache POI,它是Microsoft Documents的Java API。这个question非常相似,并且有指导我的poi。

这是一个有效的代码示例。

double input = 42165.6;
Date date = DateUtil.getJavaDate(input);
System.out.println(new SimpleDateFormat("dd.MM.yyyy HH:mm").format(javaDate));

输出正确的06/10/2015 14:24