如何将此数字解析为时间戳?

How can I parse this numbers to timestamp?

我在 java 中读取了一个 excel 文件。有一列包含日期。如果我格式化单元格 a 可以看到真实的日期。我在 excel 中没有问题,但我在 java 次中将此单元格读取为字符串,看起来像这样;

作为字符串 -> 43706,4856597222 作为 excel 中的日期 -> 29/08/2019 11:39:21

这个“43706,4856597222”格式是什么?它是某种时间戳吗?

Excel 将日期时间表示为十进制数,其中整数表示自 epoch of 0 January 1900(或正确的 1899 年 12 月 31 日)以来的天数,小数部分表示时间作为 a 的分数天.

很有帮助,Excel erroneously assumes that the year 1900 is a leap year

一天有 86400 秒。

有了这些知识,编写一个将 Excel 日期时间表示解析为 Java.

中的 LocalDateTime 对象的函数就相当简单了
import java.time.LocalDateTime;

public class ExcelParser
{
    public static void main(String[] args)
    {
        String s = "43706.4856597222";
        LocalDateTime testDate = parseExcelDate(s);
        System.out.println(testDate);
    }
    
    public static LocalDateTime parseExcelDate(String s)
    {
        long days = Long.parseLong(s.split("\.")[0]); // Get days from epoch as long
        double seconds = (Double.parseDouble(s) - days) * 86400; // Get time fraction and convert to seconds
        if (days >= 59)
        {
            days--; // Shave extra day if days push date past erroneous leap day in 1900
        }
        // Construct and return LocalDateTime object
        return LocalDateTime.of(1899, 12, 31, 0, 0, 0).plusDays(days).plusSeconds((long) Math.ceil(seconds));
    }
}

输出

2019-08-29T11:39:21

显然以上只是一个示例解决方案,没有 Exception 处理功能,但它应该让您了解如何解决这个问题。