【问题标题】:java from double epoch to date timejava从双纪元到日期时间
【发布时间】:2021-02-09 09:45:37
【问题描述】:

如何在 java 中将日期时间从 double 解析为 datetime?在 c# 中可以从this post

建议用java解析?

例子:

    44233.8647553819// --> date: 2021-02-06 20:45:14

【问题讨论】:

  • 这能回答你的问题吗? Java convert double to date format
  • 链接问题的接受答案中的相同方法也适用于此。
  • @zappee double to date 没问题,但小时、分钟和秒?用这种方法迷路了
  • @FreeBird 可以采用一些方法,但在 java 中没有添加双精度的方法,并且有关小时、分钟、秒的信息会丢失
  • @BasilBourque 这个答案被接受:stackoverflow.com/a/35929138/642319

标签: java date parsing time


【解决方案1】:

问题是,这种存储时间戳的机制是愚蠢的,而 C# 通过混合不同的时间概念来允许它。它显然可以满足您的需求,但这不是一件好事 - 这类 API 很容易出错。

在 java 中,存在相同的 API,但只允许您指定整数天 - 因此,您无法保存 .8647553819 部分 - 您必须直接应用它。

但如果不回答更多关于你在地球上的什么位置的问题,这是不可能的。

让我们从天数部分开始:

double raw = 44233.8647553819;
long days = (long) raw;
double fraction = raw - days;

LocalDate epoch = LocalDate.of(1899, 12, 30);
LocalDate date = epoch.plusDays(days);
System.out.println(date);
> 2021-02-06 - so far, so good

现在将.8647553819 转换为特定时间更加复杂。如果那个日期是只有 23 小时的一天呢?如果它有 25 小时呢?这个表示系统无法处理任何这些,而且它还存在准确性问题;双打针对准确性而非速度进行了优化。所以,这是一个尽力而为的交易

double maxSeconds = LocalTime.MAX.toSecondOfDay();
int seconds = (int) (maxSeconds * fraction);
LocalTime time = LocalTime.ofSecondOfDay(seconds);
LocalDateTime stamp = date.atTime(time);
System.out.println(stamp);
> 2021-02-06T20:45:14

我不能强调这是一个愚蠢的系统,但是,你有它。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2023-03-27
  • 2019-02-04
  • 1970-01-01
  • 2016-11-02
  • 2017-06-22
  • 1970-01-01
  • 2019-07-02
  • 1970-01-01
相关资源
最近更新 更多