Как получить nanoTime от даты?

Мне нужен nanoTime () за последние 24 часа. long currentDate = System.nanoTime (); как найти nanoTime, вычитая 24 часа? Можно ли получить nanoTime из Date date = new Date ()?

Вы можете вычесть 24 часа из nanoTime, если хотите, я думаю? System.nanoTime() - (long) (8.64e+13); Не знаю, для чего вы это используете.

Ben 14.06.2018 12:58

Nanotime - это время, прошедшее с момента включения вашего компьютера, и оно циклически возвращается к отрицательным значениям через ноль, а затем снова к положительным, если оставить включенным достаточно долго. Это не имеет ничего общего с реальным временем. Зачем вам нано-время 24 часа назад?

DodgyCodeException 14.06.2018 13:08

Я сохраняю currentTime как nanoTime в базе данных. Мне нужны последние 24 часа nanoTime, потому что я хочу получить отчет только с записями за последние 24 часа

AmrutaH 14.06.2018 13:19

Не делай этого. Когда ваш компьютер выключается или перезагружается, ваше сохраненное время становится бесполезным. Они могут быть даже по окончании программы. Если сохраняются значения с двух или более компьютеров, они также сохраняются. Из документы: «Этот метод может использоваться только для измерения прошедшего времени и не связан с каким-либо другим понятием системного времени или времени настенных часов».

Ole V.V. 14.06.2018 13:49

Почему бы просто не записать количество тиков текущего времени (new java.util.Date().getTime(), с точностью до миллисекунд, и просто вычесть из него 24 часа миллисекунд (24*60*60*1000L)?

David R Tribble 14.06.2018 17:01

Пожалуйста, поищите Stack Overflow перед публикацией. Эта тема уже неоднократно поднималась.

Basil Bourque 15.06.2018 06:55
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
4
6
872
1

Ответы 1

System.nanoTime() нельзя использовать в настоящее время. Как говорится в документации, это «не связано ни с каким другим понятием системного или настенного времени». Это также означает, что получение совместимого нано-времени от Date не имеет смысла.

Вместо этого используйте java.time.Instant в свое время. Instant.now() показывает текущее время, а начиная с Java 9 он имеет очень высокое разрешение на большинстве платформ (микросекунды на моем Mac, я считаю, что оно такое же хорошее, как и nanoTime). Тогда используйте, например, yourInstant.minus(1, ChronoUnit.DAYS) или yourInstant.minus(Duration.ofHours(24)).

I need to store long value in database.

Редактировать: Я бы предпочел сохранить Instant как таковой в базе данных, или, если это невозможно, то его строковое представление, как вы получили его из его метода toString (класс Instant может проанализировать эту строку обратно в Instant). Поскольку я понимаю, что вам необходимо сохранить длинное значение: это будет возможно до 2262-04-11T23: 47: 16.854775807Z, то есть в ближайшие более 200 лет. Если этого достаточно, вот как получить наносекунды с начала эпохи как длинное значение из Instant:

    Instant instantNow = Instant.now();
    long now = Math.addExact(
            Math.multiplyExact(instantNow.getEpochSecond(), 1_000_000_000), 
            instantNow.getNano());

Смысл использования addExact и multiplyExact из класса Math вместо обычных + и * заключается в том, что вы будете уведомлены в случае переполнения, то есть в случае, если значение не помещается в long.

is it possible to convert date to Instant, as we have search by date function on UI[?]

Чтобы преобразовать дату (например, 25 декабря 2017 г.) в Instant, вам необходимо выбрать часовой пояс для преобразования, потому что это никогда не бывает одной и той же даты на всей Земле. Например:

    ZoneId zone = ZoneId.of("Europe/Brussels");
    LocalDate date = LocalDate.of(2017, Month.DECEMBER, 25);
    Instant asInstant = date.atStartOfDay(zone).toInstant();

Чтобы ответить на ваш исходный вопрос (сомневаясь, что вы сможете его использовать), вычтите 24 часа из System.nanoTime():

    long nanoYesterday = System.nanoTime() - TimeUnit.DAYS.toNanos(1);

Спасибо. Мгновенно работает. Мне нужно сохранить длинное значение в базе данных. Если я сохраню Instant Object в db, можно ли преобразовать дату в Instant, поскольку у нас есть функция поиска по дате в пользовательском интерфейсе. Я получу объект даты. Поэтому мне нужно будет преобразовать его в Instant для сравнения.

AmrutaH 14.06.2018 14:53

Пожалуйста, посмотрите мою редакцию, @AmrutaH

Ole V.V. 14.06.2018 16:54

@AmrutaH вы действительно нужно, чтобы использовать наносекунды? Или вам нужна только временная стоимость как long? Если последнее, почему бы просто не использовать System.currentTimeMills()? (Или, что то же самое, Instant.toEpochMilli()?)

DodgyCodeException 14.06.2018 17:22

Другие вопросы по теме