首页 > 解决方案 > 如何将此数字解析为时间戳?

问题描述

我有一个用java读取的excel文件。有一列包含日期。如果我格式化单元格,可以看到真实日期。我在 excel 中没有问题,但我在 Java 时代将这些单元格读取为字符串,如下所示;

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

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

标签: javaexceldatetimestampunix-timestamp

解决方案


Excel 将日期时间表示为十进制数,其中积分表示自1900 年 1 月 0 日(或正确的 1899 年 12 月 31 日)的纪元以来的天数,小数部分表示时间为一天的一小部分。

有帮助的是,Excel 错误地假定 1900 年是闰年

一天有86400秒。

有了这些知识,编写一个将 Excel 日期时间表示解析为LocalDateTimeJava 中的对象的函数就相当简单了。

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处理功能,但它应该让您了解如何解决这个问题。


推荐阅读