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

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

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

所以,现在我想把这个时间戳parsing成这样的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))); 

我怎么能在第二行做到这一点?

非常感谢您的帮助!!!

亲切的问候

Excel将date存储为自1900年1月以来的天数。这使得转换为Javadate(自1970年1月1日以来的毫秒)变得尴尬。 如果无法以可读格式导出它,则需要创buildJava日历,将其设置为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创build,如下所示:

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

从excel表示法到java.sql.Date的最快方法是:

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

自01-01-1970以来,Excel存储date为01-01-1900的java.sql.date 。 这两个date之间恰好有25569天的差异。 java.sql.Date的构造函数需要从1970年1月1日到1970年的毫秒(!),所以用“* 86400”我们得到秒,然后用(* 1000)得到毫秒。

而已! ;)

对于我来说,mrbela和NickJ的答案都给了42165.6和我试过的大多数例子的错误答案。

为我工作的解决scheme是使用Apache POI ,这是Microsoft文档的Java API。 这个问题非常相似,并有指向我的指针。

这是一个工作代码的例子。

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