在 Excel 中,时间戳通常表示为一个数字,它表示自 1900 年 1 月 1 日以来的天数。对于 Excel 中的日期时间格式,通常有两种情况:
- 日期部分(整数部分):表示自 1900 年 1 月 1 日以来的天数。
- 时间部分(小数部分):表示当天的时间,1 小时是 1/24,1 分钟是 1/1440,1 秒是 1/86400。
要将 Excel 时间戳(通常是浮动的小数)转换为 Java 的 Date
对象,通常的做法是:
- 将 Excel 时间戳的整数部分(天数)转换为毫秒:将 Excel 日期的整数部分转换为自 1970 年 1 月 1 日(UNIX 纪元)以来的天数,首先要将它转为毫秒。
- 处理时间部分(小数部分):将小数部分转换为小时、分钟、秒,再转化为毫秒。
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);
}
}
代码解析:
- Excel的日期基准:Excel 的日期从 1900 年 1 月 1 日开始计算,但是 Excel 错误地认为 1900 是闰年(实际上 1900 年并不是闰年)。因此,Excel 和 Unix 时间戳的起始时间不一样,Unix 是从 1970 年 1 月 1 日开始。我们需要计算 Excel 起始日期(1900年1月1日)到 Unix 时间戳(1970年1月1日)之间的毫秒差。
- 整数部分和小数部分:时间戳的整数部分表示自 1900 年 1 月 1 日以来的天数,小数部分表示当天的时间。
- 转换为 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 中的日期基准。
希望这能帮助你解决问题!如果你有更多问题,随时告诉我