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