java - java.sql.Timestamp 是否提供有用的纳秒精度?

标签 java timestamp

我运行了一个简单的测试来创建一百万个时间对象并测试了以下内容

 int nano = new Timestamp(new Date().getTime()).getNanos();
 if((nano & 0x00000000003F) != 0x0) {
    System.out.println("Nano from timestamp : " +  nano);
 }

没有输出任何内容,这意味着最后的最低有效 6 位数字全为零。那么,Timestamp 是否仅依赖于从 System.currentTimeMillis() 返回的值并将其乘以 1000000?

时间戳对于纳秒精度有用吗?在当前情况下,由于我没有得到任何非零值,这意味着精度只是降低到毫秒(而不是纳秒)。

那么使用时间戳有什么好处呢?

最佳答案

类型java.sql.Timestamp使用单独的字段具有纳秒精度,如文档所示:

Note: This type is a composite of a java.util.Date and a separate nanoseconds value. Only integral seconds are stored in the java.util.Date component. The fractional seconds - the nanos - are separate.

您正在使用 java.util.Date.getTime() 设置时间戳值,仅提供毫秒精度:“返回此 Date 对象表示的自 1970 年 1 月 1 日 00:00:00 GMT 以来的毫秒数。”;该毫秒值的亚秒值存储在 nanos 字段中,换句话说,这样 nanos 的亚毫秒值为零。

如果要使用纳秒精度,则需要单独设置和获取纳秒(使用 setNanosgetNanos ),或者需要从具有纳秒精度的类型构造它( java.time.LocalDateTime) 使用 Timestamp.valueOf(java.time.LocalDateTime) .

鉴于 nanos 存储所有秒小数部分,使用 setNanos 有一些注意事项,另请参阅 java.sql.Timestamp way of storing NanoSeconds 的一些答案

这就是说,只有当您使用的数据库确实支持这种纳秒精度时,您才会受益。例如,我维护 Firebird 的 JDBC 驱动程序,而 Firebird 仅支持 100 微秒精度,而不支持纳秒精度;例如,PostgreSQL 支持微秒精度。

关于java - java.sql.Timestamp 是否提供有用的纳秒精度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37248945/

相关文章:

php - Laravel:Eloquent Query Builder 哪里有时间戳?

java - 使用spring mongo查询oplog时间戳

Java 被识别,但 Javac 未被识别

java - REST - 当我使用 GET 时 SparkJava 不更新对象 JSON

java - Eclipse SWT ImageData getPixel 在 Windows 和 Mac OSX 上返回不同的值

java - : character >= '0' and character <= 0 之间的差异

java - 此特定格式的时间戳

java - 使用 JAVA 将图像上传到 ActiveCollab API 时出现问题

postgresql - 如何在postgresql中将bigint(以毫秒为单位的时间戳)值写为时间戳

android - 如何使用 Firebase 服务器时间戳生成创建日期?