【问题标题】:Excel input to java dateExcel输入java日期
【发布时间】:2016-10-29 16:28:40
【问题描述】:

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

【问题讨论】:

    标签: java date datetime epoch


    【解决方案1】:

    问题是您使用了不同的引用。 对于 excel,第 0 天是 1899 年 12 月 31 日,对于 Date 类,第 0 天是 1/1970 年 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。

    【讨论】:

    • 因此,如果我正确理解了您的解决方案,您的建议是从 java 中的日期减去 70 年(即 25569 天的数量),以使用 excel 解释的方式来补偿格式差异日期(以天为单位)?
    • 这听起来像是一个快速的解决方法,不是很干净 - 就像你提到的那样 - 但它现在是一个快速的解决方案,所以谢谢你的回答,我仍然会等待更好和更少'hacky' 回答,但 +1,因为这个解决方法暂时有效。
    • 是的,这确实是一个 hacky 解决方法。我一直在考虑它,但除了减去偏移量之外,我看不到任何策略。正如您在问题中所做的那样,我还添加了一个使用 SimpleDateFormat 的解决方案。
    猜你喜欢
    • 2019-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-10
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 2021-04-18
    相关资源
    最近更新 更多