如何将此数字解析为时间戳?
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
处理功能,但它应该让您了解如何解决这个问题。
我在 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
处理功能,但它应该让您了解如何解决这个问题。