rmu*_*ler 5 time datetime timestamp java-8
在我们的新(基于 Java 8)应用程序中,我们希望存储审计信息,例如lastModifiedAt和createdAt。
目前,这些属性有一个java.sql.Timestamp类型,表示时间点 (UTC)。新应用程序不再使用 SQL 数据库,我们希望使用新的java.timeAPI。
什么类型最适合?
java.sql.Timestamp ,因为它根据Oracle 技术网文章 Java SE 8 日期和时间映射到java.sql.Timestamp。因为新java.time类型在此用例中提供了哪些优势?java.sql.Timestamp更高效(更少的对象创建)。我会选择即时。如果您对时间戳进行任何进一步处理(线程安全、不变性),新的 java.time api 会更好用。
java.sql.Timestamp 只是 java.util.Date 的包装器,带有额外的纳秒信息,因此它也继承了 java.util.Date 的所有缺点。速度方面,我刚刚对这三种类型做了一个小测试:
public void test() {
Instant ref = Instant.now();
Instant inst = null;
for (int i = 0; i < 10000000; i++) {
inst = Instant.now();
}
System.out.println(Duration.between(ref, Instant.now()));
ref = Instant.now();
LocalDateTime ldt = null;
for (int i = 0; i < 10000000; i++) {
ldt = LocalDateTime.now();
}
System.out.println(Duration.between(ref, Instant.now()));
ref = Instant.now();
Timestamp ts = null;
for (int i = 0; i < 10000000; i++) {
ts = new Timestamp((new Date()).getTime());
}
System.out.println(Duration.between(ref, Instant.now()));
}
Run Code Online (Sandbox Code Playgroud)
在我的机器上结果是:
因此,与 LocalDateTime 相比,Instant 的实例化速度更快。使用哪种类型还可能取决于您想要存储数据的位置和方式。
编辑 使用 LocalDateTime 还存在另一个问题:
如果您住在德国并创建一个 LocalDateTime 实例,而其他人住在美国并在同一时刻创建另一个实例(前提是时钟设置正确) - 这些对象的值实际上会有所不同。这不适用于 Instant,它的计算与时区无关。
引自这里。更改为夏令时时也可能会出现同样的问题。