LocalDateTime как общее количество наносекунд
Я работаю с объектами LocalDateTime и хотел бы сохранить их в виде Long с точностью до наносекунды.
Я пытался конвертировать между Instant представлением, но пока безуспешно.
Например:
localDateTime.toInstant(ZoneOffset.UTC).getNano
Возвращает только нано-секундный сегмент localDateTime - Есть ли способ вернуть полное значение в наносекундах?
Аналогично toEpochSecond, но не в секундах, а в наносекундах?
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