java - Excel输入到java日期

标签 java date datetime epoch

我有一个 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/

相关文章:

python - 如何在 Python 中格式化持续时间(timedelta)?

java - 如何在 Java 中将 UTF-8 转换为 unicode?

java - "FTP"客户端 - 用于下载文件的新套接字连接?

java - SSLSocketFactory createSocket 风格之间的区别

mysql - 变量中的日期 - mysql

php - 从 Mysql 检索日期并将其溢出到特定列表

javascript - new Date() 函数给出了不需要的日期字符串

python - 以 3 位毫秒的日期时间对象的形式读入字符串

java - 如何在 XPath 中处理方括号

javascript - datetimepicker 中时区的用途是什么