LocalDateTime为总纳秒

时间:2018-01-03 12:44:24

标签: java scala date time

我正在使用LocalDateTime个对象,并希望将这些对象存储为Long,具有纳秒精度。

我尝试过在Instant代表之间转换,但到目前为止失败了。

例如:

localDateTime.toInstant(ZoneOffset.UTC).getNano

仅返回localDateTime的纳秒秒段 - 有没有办法以纳秒为单位返回完整值?

toEpochSecond类似,而不是以秒为单位,纳秒?

4 个答案:

答案 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)

2262-04-11T23:47:16.854775807Z = Nanos的Long.MAX_VALUE

以正确的答案by Jean-Baptiste Yunèsby 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以来,获得纳秒总数的正确方法是:

  1. 从LocalDateTime对象创建即时对象
  2. 总结以下两种方法的结果:
    • getEpochSecond()-documentation
      • 从1970-01-01T00:00:00Z的Java时代获取秒数。
    • getNano()-documentation
      • 从秒的开始沿时间轴获取纳秒数。

示例代码

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);
}