LocalDateTime как общее количество наносекунд



Я работаю с объектами LocalDateTime и хотел бы сохранить их в виде Long с точностью до наносекунды.



Я пытался конвертировать между Instant представлением, но пока безуспешно.



Например:



localDateTime.toInstant(ZoneOffset.UTC).getNano



Возвращает только нано-секундный сегмент localDateTime - Есть ли способ вернуть полное значение в наносекундах?



Аналогично toEpochSecond, но не в секундах, а в наносекундах?

781   3  

3 ответов:

Такого метода нет, потому что вы не можете хранить все мгновения в количестве long наносекунд.

Если вы счастливы, что диапазон дат, которые вас интересуют, может уместиться в течение нескольких наносекунд с момента начала эпохи, вы можете вычислить его самостоятельно с помощью:

long nanos = ( instant.getEpochSecond * 1_000_000_000L ) + instant.getNano
Обратите внимание, что это переполнение произойдет, если дата находится слишком далеко в прошлом или будущем.

Из документации java API:

Диапазон мгновения требует хранения числа большего, чем a долго . Чтобы достичь этого, класс хранит длинное представление epoch-seconds и int, представляющий наносекунду секунды, которая будет всегда находиться между 0 и 999,999,999.

Тогда получение суммы наносов из Instant не может быть получено в одном примитивном типе как long.

2262-04-11T23: 47: 16.854775807 Z = длинный.MAX_VALUE из nanos

Основываясь на правильных ответах Жан-Батиста Юнеса и ассилиаса , объясняющих, что 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.

Я не говорю, что это хорошая идея, чтобы сделать так. Я просто показываю возможность продемонстрировать имеющиеся проблемы.

См запустить код видео на 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 ) ;

Долго.MAX_VALUE: 9223372036854775807

Секунды: 9223372036

Дробь: 854775807

Итого: 9223372036854775807

Момент: 2262-04-11T23: 47: 16.854775807 Z

Comments

    Ничего не найдено.