Java 即时到Unix时间戳

Java 即时到Unix时间戳,java,java-time,Java,Java Time,如何将即时转换为unix时间戳字符串,并使用小数表示亚秒精度 测试用例包括: @Test public void toStringUnixTime() throws Exception { assertEquals("0", TimeUtils.toStringUnixTime(Instant.EPOCH)); assertEquals("1491327940.619", TimeUtils.toStringUnixTime(Instant.ofEpochMilli(149132

如何将
即时
转换为unix时间戳字符串,并使用小数表示亚秒精度

测试用例包括:

@Test
public void toStringUnixTime() throws Exception {
    assertEquals("0", TimeUtils.toStringUnixTime(Instant.EPOCH));
    assertEquals("1491327940.619", TimeUtils.toStringUnixTime(Instant.ofEpochMilli(1491327940619L)));
    assertEquals("1491327940.000012345", TimeUtils.toStringUnixTime(Instant.ofEpochSecond(1491327940, 12345)));
}
不太有效的提案(总是尾随0,总是带点)


过了一会儿,我想到了

public static String toStringUnixTime(Instant i){
    BigDecimal nanos = BigDecimal.valueOf(i.getNano(), 9);
    BigDecimal seconds = BigDecimal.valueOf(i.getEpochSecond());
    BigDecimal total = seconds.add(nanos);
    DecimalFormat df = new DecimalFormat("#.#########");
    return df.format(total);
}

这似乎不太理想,但确实起到了作用。

这很难,因为java.time.*API故意选择不在
即时
持续时间
中提供到
大十进制
的转换。其基本原理是,在将来的某个时候,值类型将被添加到Java中,并且可能会出现一种新的、更高效的十进制类型

目前Philipp的答案很好。只需补充一点,它可以包装在
临时查询中,如下所示:

public static TemporalQuery<String> UNIX_STRING = TimeUtils::toStringUnixTime;

private static String toStringUnixTime(TemporalAccessor temporal) {
  Instant i = Instant.from(temporal);
  BigDecimal nanos = BigDecimal.valueOf(i.getNano(), 9);
  BigDecimal seconds = BigDecimal.valueOf(i.getEpochSecond());
  BigDecimal total = seconds.add(nanos);
  DecimalFormat df = new DecimalFormat("#.#########");
  return df.format(total);
}
@Test
public void toStringUnixTime() throws Exception {
  assertEquals("0", Instant.EPOCH.query(UNIX_STRING));
  assertEquals("1491327940.619", Instant.ofEpochMilli(1491327940619L).query(UNIX_STRING));
  assertEquals("1491327940.000012345", Instant.ofEpochSecond(1491327940, 12345).query(UNIX_STRING));
}

使用这样的查询通常比使用静态实用程序类更简洁。该查询还适用于
OffsetDateTime
ZoneDateTime

我认为在任何其他
TemporalAccessor
(例如LocalDate)上调用该函数都会失败,但只能在运行时进行(编译很好)?静态方法不是为您提供了更多的类型安全性吗?它将适用于任何类型,例如
Instant.from()
可以转换、
ZonedDateTime
OffsetDateTime
。但是是的,它在其他情况下会失败,比如
LocalDate
。取决于您认为什么是重要的。值类型发生了什么?查看Java10。。。仍然不存在……值类型是一项艰巨的任务。它们仍在进行中,并将持续数年。
@Test
public void toStringUnixTime() throws Exception {
  assertEquals("0", Instant.EPOCH.query(UNIX_STRING));
  assertEquals("1491327940.619", Instant.ofEpochMilli(1491327940619L).query(UNIX_STRING));
  assertEquals("1491327940.000012345", Instant.ofEpochSecond(1491327940, 12345).query(UNIX_STRING));
}