【问题标题】:Unix epoch time in fractional seconds to Joda DateTime以小数秒为单位的 Unix 纪元时间到 Joda DateTime
【发布时间】:2015-03-06 05:22:08
【问题描述】:

我有一个以小数秒表示的 unix 时间戳,我需要将其转换为 joda DateTime,但我一直在寻找正确的转换格式。值看起来像这样 1403533177.806899 ,当我尝试解析这个时,我得到以下异常

java.lang.IllegalArgumentException: Invalid format: "1403533177.806899" is malformed at "7.806899"

这是我正在使用的一段代码

DateTimeFormatter dtf = DateTimeFormat.forPattern(format);
dtf.parseDateTime(value);

我使用了以下转换格式

yyyyMMddHHmmss
yyyy-MM-dd HH:mm:ss.SSS

使用在线纪元转换器我没有任何问题转换它。谁能建议我这个时间戳的正确转换字符串?

【问题讨论】:

  • 在问题中包含您的 java 代码。
  • 也发布用于'format' 变量的值。
  • 作为一种解决方法,我现在丢弃小数部分以使其正常工作。

标签: java unix datetime jodatime


【解决方案1】:

我建议您不要为此使用日期格式化程序,而是使用一些简单的算术:

long millis = Math.round(value * 1000);
DateTime dt = new DateTime(millis, DateTimeZone.forOffsetHours(0));

这会将给定的秒数和微秒数四舍五入到最接近的毫秒数,并基于此创建一个新的 DateTime 实例。

您有一个以秒为单位的纪元时间戳,而 JodaTime DateTime 内部表示也是一个以毫秒为单位的纪元时间戳。

格式化程序将人类可读的日期和时间转换为纪元,所以它真的不是你需要的,它只是一个很长的路要走。

如果您稍后需要打印该值,则可以使用DateTimeFormatter

DateTimeFormatter dtf = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss.SSSz");
dtf.print(dt);

【讨论】:

  • FWIW,我会使用 floor 而不是 round - 计算机认为时间比实际时间更先进通常不是一个好主意。
  • @Alnitak “时间比现在更先进”是什么意思?输入时间戳有 6 位小数,表示微秒精度。为什么会以这种方式失去精度?
  • 我仍然会保持毫秒精度——“更高级”是指“将来”(即使只是毫秒的几分之一)。
猜你喜欢
  • 2014-09-02
  • 1970-01-01
  • 2019-02-24
  • 2015-07-08
  • 2018-06-21
  • 2013-09-11
  • 1970-01-01
  • 1970-01-01
  • 2017-06-28
相关资源
最近更新 更多