Текущее время в микросекундах в Яве

В системе Unix есть ли способ получить метку времени с точностью до микросекундного уровня в Java? Что-то вроде функции C gettimeofday.

91 голос | спросил Seth 11 32009vEurope/Moscow11bEurope/MoscowWed, 11 Nov 2009 03:25:39 +0300 2009, 03:25:39

8 ответов


0

Нет, у Java нет такой возможности.

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

Обратите внимание, что JavaDoc говорит, что, хотя это обеспечивает точность наносекунды, это не означает точность наносекунды. Итак, возьмите достаточно большой модуль возвращаемого значения.

ответил AlBlue 11 32009vEurope/Moscow11bEurope/MoscowWed, 11 Nov 2009 03:28:17 +0300 2009, 03:28:17
0

Вы можете использовать System.nanoTime() :

long start = System.nanoTime();
// do stuff
long end = System.nanoTime();
long microseconds = (end - start) / 1000;

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

ответил cletus 11 32009vEurope/Moscow11bEurope/MoscowWed, 11 Nov 2009 03:28:49 +0300 2009, 03:28:49
0

Если вы заинтересованы в Linux: Если вы выберете исходный код для currentTimeMillis (), вы увидите, что в Linux, если вы вызовете этот метод, он вернется на микросекунду назад. Однако Java затем усекает микросекунды и возвращает вам миллисекунды. Отчасти это связано с тем, что Java должна быть кроссплатформенной, поэтому предоставление методов, специально предназначенных для Linux, было очень сложным задним числом (помните, что поддержка грубых программных ссылок начиная с 1.6 и выше ?!) Это также потому, что, хотя ваши часы могут возвращать вам микросекунды в Linux, это не обязательно означает, что это будет хорошо для проверки времени. На микросекундных уровнях вы должны знать, что NTP не перераспределяет ваше время и что ваши часы не слишком сильно сдвигаются во время вызовов методов.

Это означает, что теоретически в Linux вы можете написать оболочку JNI, такую ​​же, как в пакете System, но не обрезать микросекунды.

ответил Badgerous 31 WedEurope/Moscow2014-12-31T20:14:37+03:00Europe/Moscow12bEurope/MoscowWed, 31 Dec 2014 20:14:37 +0300 2014, 20:14:37
0

«быстрое и грязное» решение, с которым я в конце концов пошел:

TimeUnit.NANOSECONDS.toMicros(System.nanoTime());

UPDATE:

Изначально я использовал System.nanoTime, но потом обнаружил, что его следует использовать только в течение истекшего времени, в конце концов я изменил свой код для работы с миллисекундами или в некоторых местах:

TimeUnit.MILLISECONDS.toMicros(System.currentTimeMillis());

но это просто добавит нули в конце значения (micros = millis * 1000)

Оставьте этот ответ здесь как «предупреждающий знак» на тот случай, если кто-то еще подумает о nanoTime:)

ответил keisar 14 +03002015-10-14T18:32:47+03:00312015bEurope/MoscowWed, 14 Oct 2015 18:32:47 +0300 2015, 18:32:47
0

Java поддерживает микросекунды через TimeUnit enum.

Вот документация по Java: Enum TimeUnit

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

long microsenconds = TimeUnit.MILLISECONDS.toMicros(System.currentTimeMillis());

Вы также можете преобразовать микросекунды в другие единицы времени, например:

long seconds = TimeUnit.MICROSECONDS.toSeconds(microsenconds);
ответил tanghao 21 stEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 21 Sep 2016 10:01:00 +0300 2016, 10:01:00
0

Вы можете создать компонент, который определяет смещение между System.nanoTime () и System.currentTimeMillis () и эффективно получать наносекунды с начала эпохи.

public class TimerImpl implements Timer {

    private final long offset;

    private static long calculateOffset() {
        final long nano = System.nanoTime();
        final long nanoFromMilli = System.currentTimeMillis() * 1_000_000;
        return nanoFromMilli - nano;
    }

    public TimerImpl() {
        final int count = 500;
        BigDecimal offsetSum = BigDecimal.ZERO;
        for (int i = 0; i < count; i++) {
            offsetSum = offsetSum.add(BigDecimal.valueOf(calculateOffset()));
        }
        offset = (offsetSum.divide(BigDecimal.valueOf(count))).longValue();
    }

    public long nowNano() {
        return offset + System.nanoTime();
    }

    public long nowMicro() {
        return (offset + System.nanoTime()) / 1000;
    }

    public long nowMilli() {
        return System.currentTimeMillis();
    }
}

Следующий тест дает довольно хорошие результаты на моей машине.

    final Timer timer = new TimerImpl();
    while (true) {
        System.out.println(timer.nowNano());
        System.out.println(timer.nowMilli());
    }

Разница, кажется, колеблется в диапазоне + -3 мс. Полагаю, можно немного больше изменить расчет смещения.

1495065607202174413
1495065607203
1495065607202177574
1495065607203
...
1495065607372205730
1495065607370
1495065607372208890
1495065607370
...
ответил kangcz 18 Mayam17 2017, 03:00:51
0

Если вы намереваетесь использовать его для системы реального времени, возможно, java не лучший выбор для получения метки времени. Но если вы собираетесь использовать if для уникального ключа, то ответа Джейсона Смита будет достаточно. Но на всякий случай, чтобы ожидать, что 2 элемента получат одну и ту же временную метку (это возможно, если эти 2 были обработаны почти одновременно), вы можете выполнить цикл, пока последняя временная метка не будет равна текущей временной метке.

String timestamp = new String();
do {
    timestamp = String.valueOf(MicroTimestamp.INSTANCE.get());
    item.setTimestamp(timestamp);
} while(lasttimestamp.equals(timestamp));
lasttimestamp = item.getTimestamp();
ответил wingedcrown 27 +03002014-10-27T01:59:22+03:00312014bEurope/MoscowMon, 27 Oct 2014 01:59:22 +0300 2014, 01:59:22
0

Вот пример того, как создать текущую временную метку UnsignedLong:

UnsignedLong current = new UnsignedLong(new Timestamp(new Date().getTime()).getTime());
ответил 20 PMpFri, 20 Apr 2012 22:52:14 +040052Friday 2012, 22:52:14

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132