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));
}