我知道:
仍然最终IMO都可以作为大多数应用程序用例的类型.例如:目前我正在运行一个批处理作业,我需要根据日期计算下一次运行,我很难找到这两种类型之间的优缺点(除了Instant的纳秒级精度优势和时区部分) of LocalDateTime).
您能说出一些应用示例,其中只应使用Instant或LocalDateTime吗?
编辑:注意有关精度和时区的LocalDateTime的误读文档
我正在添加这个问题,因为我是Java和Android的新手,我搜索了几个小时试图解决这个问题.答案来自相关答案的组合,所以我想我会记录我为其他可能正在努力的人学到的东西.见答案.
对于一些背景知识,我的经验主要是PHP的Web开发和一点Ruby.我唯一的操作系统是Linux(Ubuntu Studio),我(不情愿地)在Android Studio 2.1.2中开发我的第一个Android应用程序.我的Java设置如下:
>java -version
> openjdk version "1.8.0_91"
> OpenJDK Runtime Environment (build 1.8.0_91-8u91-b14-3ubuntu1~15.10.1-b14)
> OpenJDK 64-Bit Server VM (build 25.91-b14, mixed mode)
Run Code Online (Sandbox Code Playgroud) datetime android android-gradle-plugin threetenbp threetenabp
Java 8中新的Date Time API的一个特性应该是纳秒精度.但是,当我将当前日期时间打印到控制台时,就像这样
DateTimeFormatter formatter = DateTimeFormatter
.ofPattern("yyyy-MM-dd'T'HH:mm:ss,nnnnnnnnnZ");
System.out.println(OffsetDateTime.now().format(formatter));
Run Code Online (Sandbox Code Playgroud)
我只看到毫秒精度:2015-11-02T12:33:26,746000000 + 0100
操作系统似乎确实支持纳秒精度.当我通过终端打印当前日期时间
date -Ins
Run Code Online (Sandbox Code Playgroud)
我看到2015-11-02T12:33:26,746134417 + 0100
如何在Java中获得纳秒精度?我在Ubuntu 14.04 64位上运行Oracle Java 1.8.0_66
Java 8的java.time.Instant以"纳秒分辨率"存储,但使用Instant.now()只提供毫秒分辨率......
Instant instant = Instant.now();
System.out.println(instant);
System.out.println(instant.getNano());
Run Code Online (Sandbox Code Playgroud)
结果...
2013-12-19T18:22:39.639Z
639000000
Run Code Online (Sandbox Code Playgroud)
我怎样才能获得一个"现在"值但具有纳秒分辨率的瞬间?
我检查了下面的页面,没有方法可以获得2009年Java中微秒精度的当前时间.
当前时间以微秒为单位的java
最好的是System.currentTimeMillis(),它以毫秒为单位给出当前时间的准确度,而System.nanoTime()给出当前时间戳的准确度,以纳秒为单位,但是这个时间戳不能用于高精度地转换为当前时间.
我可以在6年后知道Java中是否有任何新的更新?谢谢.
编辑1. System.nanoTime()对于估计持续时间非常有用,但不能提供当前时间.
编辑2.在Java 8中使用解决方案是件好事.在Java 7中还有其他方法吗?谢谢!
我目前正在将一些项目从 Java 8 升级到 Java 11,其中一个转换器的单元测试失败了。基本上问题源于由于先前通过 JDK 8 传递的日期精度导致的相等性检查失败。
这是测试的部分示例,为了清楚起见,我移动了转换器的内容:
@Test
public void testDateTime() {
LocalDateTime expected = LocalDateTime.now().plusDays(1L);
// converter contents
long epochMillis = expected.atZone(ZoneId.systemDefault())
.toInstant().toEpochMilli();
LocalDateTime actual = LocalDateTime.ofInstant(Instant.ofEpochMilli(epochMillis),
TimeZone.getDefault().toZoneId());
assertThat(actual, equalTo(expected));
}
Run Code Online (Sandbox Code Playgroud)
由于以下原因,这会导致资产错误:
Expected :<2021-06-02T14:06:21.820299>
Actual :<2021-06-02T14:06:21.820>
Run Code Online (Sandbox Code Playgroud)
我可以用 assertThat(actual, equalTo(expected.truncatedTo(ChronoUnit.MILLIS)))它们相等,但是,这意味着每次与被测试的转换器类进行比较(isAfter、isBefore、equals)时,都必须应用中继。
对于 JDK 11(或者我可能错过的文档:)),是否有正确的方法可以在LocalDateTimeto之间进行转换,Long反之亦然?
更新:
正如评论中所指出的,Java 8 和 11 的表示形式不同,因此导致测试失败。为了提供有关本文所要求内容的更多上下文,这里是测试验证的 2 种方法(我将其移至测试本身以仅捕获正在执行的内容,因为失败的单元测试属于使用实用方法)
public Long localDateTimeToEpochMillis(LocalDateTime ldt) {
Instant instant = ldt.atZone(ZoneId.systemDefault()).toInstant();
return ldt.atZone(ZoneId.systemDefault())
.toInstant().toEpochMilli();
}
Run Code Online (Sandbox Code Playgroud)
和
public LocalDateTime epochMillisToLocalDateTime(long epochMillis) {
return LocalDateTime.ofInstant( …Run Code Online (Sandbox Code Playgroud)