我正在使用LocalDateTime
个对象,并希望将这些对象存储为Long
,具有纳秒精度。
我尝试过在Instant
代表之间转换,但到目前为止失败了。
例如:
localDateTime.toInstant(ZoneOffset.UTC).getNano
仅返回localDateTime
的纳秒秒段 - 有没有办法以纳秒为单位返回完整值?
与toEpochSecond
类似,而不是以秒为单位,纳秒?
答案 0 :(得分:2)
来自java API文档:
瞬间范围需要存储大于a的数字 长即可。为实现此目的,该类存储一个长代表 epoch-seconds和一个代表纳秒秒的int,它将会 总是在0到999,999,999之间。
然后无法在Instant
的单个基元类型中检索来自long
的总纳米数。
答案 1 :(得分:1)
没有这样的方法,因为你不能以long
个纳秒的速度存储所有瞬间。
如果您感兴趣的是您感兴趣的日期范围可以长达自纪元以来的纳秒数,您可以自己计算:
long nanos = ( instant.getEpochSecond * 1_000_000_000L ) + instant.getNano
请注意,如果日期过去或将来太远,这将会溢出。
答案 2 :(得分:1)
以正确的答案by Jean-Baptiste Yunès和by assylias为基础,解释64位长整数不能将所有Instant
值表示为自1970-01-01T00:00Z以来的纳秒数...
如果我的数学是正确的话,您可以使用long
/ Long
计算纳秒数来表示接下来两个世纪的时刻,最高可达2262-04-11T23:47:16.854775807Z
:
Instant.ofEpochSecond( ( Long.MAX_VALUE / 1_000_000_000L ) , ( Long.MAX_VALUE % 1_000_000_000L ) )
仅供参考,Long.MAX_VALUE
= 9223372036854775807。
我并不是说这样做是个好主意。我只是展示了展示手头问题的可能性。
请参阅code run live at IdeOne.com。
long seconds = ( Long.MAX_VALUE / 1_000_000_000L ) ;
long fraction = ( Long.MAX_VALUE % 1_000_000_000L ) ;
long total = ( ( seconds * 1_000_000_000L ) + fraction ) ;
Instant instant = Instant.ofEpochSecond( seconds , fraction ) ;
System.out.println( "Long.MAX_VALUE: " + Long.MAX_VALUE ) ;
System.out.println( "seconds: " + seconds ) ;
System.out.println( "fraction: " + fraction ) ;
System.out.println( "total: " + total ) ;
System.out.println( "instant: " + instant ) ;
Long.MAX_VALUE:9223372036854775807
秒:9223372036
分数:854775807
总计:9223372036854775807
时刻:2262-04-11T23:47:16.854775807Z
答案 3 :(得分:1)
从 LocalDateTime 对象获取EPOCH以来,获得纳秒总数的正确方法是:
public static void main(String args[]) {
Instant instant = LocalDateTime.now().atZone(ZoneId.systemDefault()).toInstant();
long epochNanos = TimeUnit.NANOSECONDS.convert(instant.getEpochSecond(), TimeUnit.SECONDS);
epochNanos += instant.getNano();
System.out.print("Total nanos since EPOCH: " + epochNanos);
}