我有一个 Excel 工作表,其中一个单元格包含 1920 年 9 月 4 日的日期值,我想解析它并将其用于我的应用程序。从 Excel 工作表中提取它可以正常工作,但不能正确转换日期。有趣的是,当我从 Excel 工作表中提取包含 datevalue
的单元格时,它不会返回 dateformat
或任何内容,而是返回一个 double 值。
我需要将这个 double 值 (7552.0) 转换成一个有效的 Date
对象,但我似乎无法正确地做到这一点,这是迄今为止我得到的最接近的值:
new SimpleDateFormat("D").parse(getDateFromExcelAsString())
getDateFromExcelAsString()
方法将 double 转换为字符串:
String.valueOf(dateAsDouble.intValue())
问题在于此方法将 7552.0 double 值转换为日期:1990 年 9 月 4 日。但这应该是 1920 年 9 月 3 日。
最佳答案
问题是您使用的是不同的引用。 对于 excel,第 0 天是 31/Dec/1899,对于 Date 类,第 0 天是 1/Jan/1970,这导致了 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。
关于java - Excel输入到java日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38057669/