java - 如何将此数字解析为时间戳?
问题描述
我有一个用java读取的excel文件。有一列包含日期。如果我格式化单元格,可以看到真实日期。我在 excel 中没有问题,但我在 Java 时代将这些单元格读取为字符串,如下所示;
作为字符串 -> 43706,4856597222 作为 Excel 中的日期 -> 29/08/2019 11:39:21
这是什么“43706,4856597222”格式?是某种时间戳吗?
解决方案
Excel 将日期时间表示为十进制数,其中积分表示自1900 年 1 月 0 日(或正确的 1899 年 12 月 31 日)的纪元以来的天数,小数部分表示时间为一天的一小部分。
有帮助的是,Excel 错误地假定 1900 年是闰年。
一天有86400秒。
有了这些知识,编写一个将 Excel 日期时间表示解析为LocalDateTime
Java 中的对象的函数就相当简单了。
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
处理功能,但它应该让您了解如何解决这个问题。
推荐阅读
- microsoft-cognitive - 计算机视觉 API v1.0 和 v2.0 有什么区别?
- matlab - 如何在原始数据下获得一条线
- html - 字体 Lato,加粗一些捷克字符
- c# - Google OAuth 在成功验证后显示错误网页(在桌面应用程序中使用 Google API .NET)
- c# - 如何使用 selenium c# 计算嵌套的 div?
- wso2 - WSO2 Identity Server oAuth2:如何保留来自 IDP 的原始访问令牌
- html - align-items:baseline 和 align-items:flexstart 没有区别
- php - Adobe 括号 - 实时预览不起作用 - Chrome 远程调试
- python - 使代码不区分大小写、Python、Discord Bot
- c# - 实体框架核心日志警告