【问题标题】:Which java.time type best fits for auditing information?哪种 java.time 类型最适合审计信息?
【发布时间】:2016-02-28 03:40:42
【问题描述】:
在我们的新(基于 Java 8)应用程序中,我们希望存储审计信息,例如 lastModifiedAt 和 createdAt。
目前这些属性有一个java.sql.Timestamp 类型,代表一个时刻(UTC)。新应用程序不再使用 SQL 数据库,我们希望使用新的 java.time API。
哪种类型最适合?
【问题讨论】:
标签:
datetime
time
timestamp
java-8
【解决方案1】:
我会选择 Instant。如果您对时间戳进行任何进一步处理(线程安全、不变性),则新的 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()));
}
在我的机器上结果是:
- 瞬间:0.188 秒
- LocalDateTime:1.856 秒
- 时间戳:0.173 秒
因此,与 LocalDateTime 相比,Instant 的实例化速度更快。使用哪种类型可能还取决于您要存储数据的位置和方式。
编辑
使用 LocalDateTime 还有一个问题:
如果您居住在德国并创建一个 LocalDateTime 实例和某人
else 住在美国并在同一时刻创建另一个实例
(如果时钟设置正确) - 这些对象的值
实际上会有所不同。这不适用于 Instant,即
独立于时区计算。
引自here。更改为夏令时时可能会出现同样的问题。