我正在从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行做到这一点?!
非常感谢你的帮助!!!
亲切的问候
答案 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:23
和06/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