Мне нужен nanoTime () за последние 24 часа. long currentDate = System.nanoTime (); как найти nanoTime, вычитая 24 часа? Можно ли получить nanoTime из Date date = new Date ()?
Nanotime - это время, прошедшее с момента включения вашего компьютера, и оно циклически возвращается к отрицательным значениям через ноль, а затем снова к положительным, если оставить включенным достаточно долго. Это не имеет ничего общего с реальным временем. Зачем вам нано-время 24 часа назад?
Я сохраняю currentTime как nanoTime в базе данных. Мне нужны последние 24 часа nanoTime, потому что я хочу получить отчет только с записями за последние 24 часа
Не делай этого. Когда ваш компьютер выключается или перезагружается, ваше сохраненное время становится бесполезным. Они могут быть даже по окончании программы. Если сохраняются значения с двух или более компьютеров, они также сохраняются. Из документы: «Этот метод может использоваться только для измерения прошедшего времени и не связан с каким-либо другим понятием системного времени или времени настенных часов».
Почему бы просто не записать количество тиков текущего времени (new java.util.Date().getTime(), с точностью до миллисекунд, и просто вычесть из него 24 часа миллисекунд (24*60*60*1000L)?
Пожалуйста, поищите Stack Overflow перед публикацией. Эта тема уже неоднократно поднималась.




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
@AmrutaH вы действительно нужно, чтобы использовать наносекунды? Или вам нужна только временная стоимость как long? Если последнее, почему бы просто не использовать System.currentTimeMills()? (Или, что то же самое, Instant.toEpochMilli()?)
Вы можете вычесть 24 часа из
nanoTime, если хотите, я думаю?System.nanoTime() - (long) (8.64e+13);Не знаю, для чего вы это используете.