Почему новый Java 8 Time Time API не имеет наносекундной точности?

Одна из возможностей нового API Date Time в Java 8 - наносекундная точность. Однако, когда я печатаю текущее время Date на консоль, как показано ниже

DateTimeFormatter formatter = DateTimeFormatter
    .ofPattern("yyyy-MM-dd'T'HH:mm:ss,nnnnnnnnnZ");
System.out.println(OffsetDateTime.now().format(formatter)); 

Я вижу только миллисекундную точность: 2015-11-02T12: 33: 26,746000000 + 0100

Операционная система, похоже, поддерживает наносекундную точность. Когда я печатаю текущее время даты через терминал

date -Ins

Я вижу 2015-11-02T12: 33: 26,746134417 + 0100

Как получить наносекундную точность в Java? Я запускаю Oracle Java 1.8.0_66 на 64-разрядной версии Ubuntu 14.04

Ответ 1

API java.time в целом имеет точность наносекунд. Например:

DateTimeFormatter formatter = DateTimeFormatter
    .ofPattern("yyyy-MM-dd'T'HH:mm:ss,nnnnnnnnnZ");
OffsetDateTime odt = OffsetDateTime.of(2015, 11, 2, 12, 38, 0, 123456789, ZoneOffset.UTC);
System.out.println(odt.format(formatter));

Вывод:

2015-11-02T12:38:00,123456789+0000

Тем не менее, это значение часов, возвращаемое OffsetDateTime.now(), которое возвращает значение, которое имеет только миллисекунды.

Из Clock реализация в Java 8:

Представленная здесь синхронизация основана на System.currentTimeMillis(). Этот метод практически не гарантирует точность часов. Приложения, требующие более точных часов, должны сами реализовать этот абстрактный класс, используя различные внешние часы, такие как NTP-сервер.

Таким образом, здесь нет ничего сложного - просто реализация по умолчанию Clock с помощью System.currentTimeMillis(). Вы могли бы создать свой собственный более точный подкласс. Однако вы должны отметить, что добавление большей точности без добавления большей точности, вероятно, не очень полезно. (Бывают моменты, когда это может быть, правда...)

Ответ 2

Чтобы сделать важное дополнение к ответу Джона Скита, Java 9 должен доставлять часы с улучшенной точностью - см. журнал ошибок. Справочная информация. Во многих операционных системах (особенно Linux) есть лучшие часы.

Спецификация Java SE 8 для java.time.Clock заявляет, что "The системы factory обеспечивают часы на основе лучших доступных
системные часы. Это может использовать System.currentTimeMillis() или более высокий если доступно". В JDK 8 реализация Возвращаемые часы были основаны на System.currentTimeMillis() и таким образом, имеет только миллисекундное разрешение. В JDK 9 реализация
основано на базовых часах, которые System.currentTimeMillis() использует, обеспечивая максимальное разрешение доступный с этих часов. В большинстве систем это могут быть микросекунды, или иногда даже десятую часть микросекунд.

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

Следует также отметить (экзотический) факт, что вторая точность не будет существовать вблизи скачков секунд - даже в Java 9.