Как узнать текущее время в нано секундах в Java? - PullRequest
0 голосов
/ 29 августа 2018

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

Мне это нужно, чтобы избежать дублирования точек в InfluxDB, см. Как InfluxDB обрабатывает дубликаты точек? Поэтому, когда я использую миллисекунду, я сталкиваюсь с проблемами объединения данных. Поэтому необходимо решить использовать наносекунду, но проблема в том, что при генерации наносекунды, использующей System.nanoTime(), не было данных о текущей дате и времени. и это дает мне время безотказной работы JVM, что для меня бесполезно.

Ответы [ 3 ]

0 голосов
/ 29 августа 2018

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

Clock clock = Clock.systemDefaultZone();
Instant instant = clock.instant();   // or Instant.now();
long seconds = instant.getEpochSecond();
long nano = instant.getNano();
// epoch nanoseconds = seconds * 10E9 + nano

Проблемы:

  1. Вызов systemDefaultZone() дает «лучшие из доступных часов» для платформы. Спецификация JVM говорит, что это может иметь точность с точностью выше миллисекунды, но это не гарантируется. Так что значение nano может иметь точность не более миллисекунды.

  2. Значения секунд и нано зависят от точности локальных аппаратных часов. Во многих системах синхронизировать локальные часы с «реальным» временем сложно. Часто точность до миллисекунды является сложной задачей, а кажущаяся наносекундная точность - иллюзия.

  3. Даже если вам удалось синхронизировать аппаратные часы с точностью «реального» времени с точностью до наносекунды, накладные расходы и изменчивость при выполнении вышеуказанных вызовов для получения времени наносекунды эпохи нарушат точность наносекунды. (Такие вещи, как изменчивость кэша памяти, насколько занята шина основной памяти и т. Д. И дрейф локальных аппаратных часов с момента их последней синхронизации.)

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

0 голосов
/ 29 августа 2018

Наконец, спасибо за мистера Франца Вильгельмштеттера

Я нашел одно решение. используя http://jenetics.io/ и Класс call NanoClock.java конвертирует и выполняет тот же трюк, который предложил Стивен С. Я хочу поделиться этим, потому что это будет полезно и для других. Я не могу подтвердить, что дано точное нано время, но этот прием работает для меня. @ Оле В.В. Еще раз спасибо за вашу помощь.

0 голосов
/ 29 августа 2018

Вы получаете наилучшую точность и точность, которую Java может дать вам от Instant.now(). Достаточно ли этого для решения вашей проблемы, я не смею сказать. Конечно, на обычном компьютере нет способа получить точность наносекунды.

Возможно, вам придется сыграть несколько хитростей с добавлением искусственной наносекунды в случае, если Instant.now() дважды возвращает одно и то же значение.

Или просто используйте трюк, упомянутый в ваша ссылка :

Введите произвольный новый тег для обеспечения уникальности.

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

public class TimeProvider {

    Instant last = Instant.now().minusSeconds(1);

    Instant getUniqueInstant() {
        Instant result = Instant.now();
        if (! result.isAfter(last)) {
            result = last.plusNanos(1);
        }
        last = result;
        return result;
    }
}

Когда я быстро прорисовываю время из этого класса на своем компьютере, я получаю результаты, как показано ниже. Казалось бы из вывода (как я его интерпретирую):

  • Моя JVM не может получить более высокую точность, чем микросекунды (6 десятичных знаков в секундах) от системных часов.
  • Время от времени добавляется искусственная наносекунда для сохранения уникальности моментов.

.

2018-08-29T15:18:35.617616001Z
2018-08-29T15:18:35.617617Z
2018-08-29T15:18:35.617618Z
2018-08-29T15:18:35.617618001Z
2018-08-29T15:18:35.617619Z
2018-08-29T15:18:35.617619001Z
2018-08-29T15:18:35.617620Z
2018-08-29T15:18:35.617620001Z
2018-08-29T15:18:35.617621Z
2018-08-29T15:18:35.617621001Z
2018-08-29T15:18:35.617622Z
2018-08-29T15:18:35.617623Z
2018-08-29T15:18:35.617623001Z
2018-08-29T15:18:35.617624Z
2018-08-29T15:18:35.617624001Z
2018-08-29T15:18:35.617625Z
2018-08-29T15:18:35.617625001Z
2018-08-29T15:18:35.617626Z
2018-08-29T15:18:35.617626001Z
2018-08-29T15:18:35.617627Z
2018-08-29T15:18:35.617627001Z
2018-08-29T15:18:35.617628Z
2018-08-29T15:18:35.617631Z
2018-08-29T15:18:35.617634Z
2018-08-29T15:18:35.617635Z
2018-08-29T15:18:35.617636Z
2018-08-29T15:18:35.617636001Z
2018-08-29T15:18:35.617637Z
2018-08-29T15:18:35.617637001Z
2018-08-29T15:18:35.617638Z
...