在 Excel 中,时间戳通常表示为一个数字,它表示自 1900 年 1 月 1 日以来的天数。对于 Excel 中的日期时间格式,通常有两种情况:

  1. 日期部分(整数部分):表示自 1900 年 1 月 1 日以来的天数。
  2. 时间部分(小数部分):表示当天的时间,1 小时是 1/24,1 分钟是 1/1440,1 秒是 1/86400。

要将 Excel 时间戳(通常是浮动的小数)转换为 Java 的 Date 对象,通常的做法是:

  1. 将 Excel 时间戳的整数部分(天数)转换为毫秒:将 Excel 日期的整数部分转换为自 1970 年 1 月 1 日(UNIX 纪元)以来的天数,首先要将它转为毫秒。
  2. 处理时间部分(小数部分):将小数部分转换为小时、分钟、秒,再转化为毫秒。

Java 转换 Excel 时间戳的步骤

以下是将 Excel 时间戳(以 double 类型表示)转换为 Java Date 对象的代码示例:

import java.util.Date;

public class ExcelToJavaDate {
    public static Date convertExcelTimestampToDate(double excelTimestamp) {
        // Excel 从 1900年1月1日开始计时(但是 Excel 错误地认为 1900 是闰年)
        // 所以应该使用 1900年1月1日作为基准日期。
        // Excel 的日期基准:1900年1月1日(Excel中日期为1时,实际是 1900年1月1日)
        long excelBaseDateMillis = 25569L * 24L * 60L * 60L * 1000L; // 1900年1月1日到1970年1月1日的毫秒数

        // 获取Excel时间戳的整数部分(天数)
        long integerPart = (long) excelTimestamp;

        // 获取Excel时间戳的小数部分(表示当天的时间)
        double decimalPart = excelTimestamp - integerPart;

        // 将小数部分转换为毫秒
        long timeInMillis = (long) (decimalPart * 24 * 60 * 60 * 1000);

        // Excel的时间戳转换为Java的日期(毫秒)
        long javaDateMillis = excelBaseDateMillis + (integerPart * 24L * 60L * 60L * 1000L) + timeInMillis;

        return new Date(javaDateMillis);  // 返回Java Date对象
    }

    public static void main(String[] args) {
        // 示例:Excel 时间戳 44561.75(相当于 2021年12月30日 18:00:00)
        double excelTimestamp = 44561.75;
        Date javaDate = convertExcelTimestampToDate(excelTimestamp);

        System.out.println("Converted Java Date: " + javaDate);
    }
}

代码解析:

  1. Excel的日期基准:Excel 的日期从 1900 年 1 月 1 日开始计算,但是 Excel 错误地认为 1900 是闰年(实际上 1900 年并不是闰年)。因此,Excel 和 Unix 时间戳的起始时间不一样,Unix 是从 1970 年 1 月 1 日开始。我们需要计算 Excel 起始日期(1900年1月1日)到 Unix 时间戳(1970年1月1日)之间的毫秒差。
  2. 整数部分和小数部分:时间戳的整数部分表示自 1900 年 1 月 1 日以来的天数,小数部分表示当天的时间。
  3. 转换为 Java Date:通过将天数部分和时间部分转换为毫秒,再加上 1900 年 1 月 1 日到 Unix 纪元之间的毫秒差,最后得到对应的 Java Date 对象。

示例:

假设 Excel 时间戳为 44561.75,对应的日期时间应该是 2021 年 12 月 30 日,时间为 18:00:00。运行上述代码时,输出会是:

Converted Java Date: Thu Dec 30 18:00:00 CST 2021

注意:

  • 在 Excel 中,如果是 Date 类型的时间戳,它会以 double 类型存储,整数部分是天数,小数部分表示一天中的时间。
  • 在处理日期转换时,确保正确理解 Excel 和 Java 中的日期基准。

希望这能帮助你解决问题!如果你有更多问题,随时告诉我