我有一个excel表格,其中一个单元格包含1920年9月4日的日期值,我想解析并使用到我的应用程序中。从excel表中提取它可以正常工作,但它不能正确转换日期。有趣的是,当我从excel表中提取包含datevalue
的单元格时,它不会返回dateformat
或任何东西,而是返回一个双值。
我需要把这个双值(7552.0)转换成一个有效的Date
对象,但我似乎不能正确地做到这一点,这是我到目前为止最接近的:
new SimpleDateFormat("D").parse(getDateFromExcelAsString())
getDateFromExcelAsString()
方法将双精度转换为字符串:
String.valueOf(dateAsDouble.intValue())
问题是该方法将7552.0双精度值转换为日期:1990年9月4日。但这应该是1920年9月3日
问题是您使用了不同的引用。对于excel,第0天是1899年12月31日,而对于Date类,第0天是1970年1月1日,这导致了70年的偏差。
我已经测试了一个简单而丑陋的解决方案,如:
double value = 7552;
Date date = new Date(0);
Calendar cal = new GregorianCalendar();
cal.setTime(date);
cal.add(Calendar.DATE, (int) value - 25569);
System.out.println(new SimpleDateFormat("d MMMM yyyy").format(cal.getTime()));
控制台输出是预期的:
3 September 1920
编辑:由于在您的问题中,您使用SimpleDateFormat来解析excel值,因此我将在这里添加使用该方法(而不是日历)的快速而不干净的解决方案。
double value = 7552;
SimpleDateFormat inputFormat = new SimpleDateFormat("D");
Date date = inputFormat.parse("" + (value - 25568));
SimpleDateFormat outputFormat = new SimpleDateFormat("d MMMM yyyy");
System.out.println(outputFormat.format(date));
再次控制台输出为:
3 September 1920
请注意,现在的天偏移量是25568,因为SimpleDateFormat的第0天是31/Dec/1969。