Время Java с эпохи

В Java, как я могу распечатать время с момента, заданного в секундах и наносекундах в следующем формате:

java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");

Мой ввод:

long mnSeconds;
long mnNanoseconds;

В том случае, когда общая сумма этих двух составляет истекшее время с эпохи 1970-01-01 00:00:00.0.

Ответ 1

Вы можете сделать это

public static String format(long mnSeconds, long mnNanoseconds) {
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.");
    return sdf.format(new Date(mnSeconds*1000))
           + String.format("%09d", mnNanoseconds);
}

например.

2012-08-08 19:52:21.123456789

если вам действительно не нужно больше миллисекунд, которые вы можете сделать

public static String format(long mnSeconds, long mnNanoseconds) {
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
    return sdf.format(new Date(mnSeconds*1000 + mnNanoseconds/1000000));
}

Ответ 2

Используйте это и разделите на 1000

long epoch = System.currentTimeMillis();

System.out.println("Epoch : " + (epoch / 1000));

Ответ 3

ТЛ; др

    Instant                        // Represent a moment in UTC.
    .ofEpochSecond( mnSeconds )   // Determine a moment from a count of whole seconds since the Unix epoch of the first moment of 1970 in UTC (1970-01-01T00:00Z). 
    .plusNanos( mnNanoseconds )    // Add on a fractional second as a count of nanoseconds. Returns another 'Instant' object, per Immutable Objects pattern.
    .toString()                    // Generate text representing this 'Instant' object in standard ISO 8601 format.
    .replace( "T" , " " )          // Replace the 'T' in the middle with a SPACE. 
    .replace "Z" , "" )            // Remove the 'Z' on the end (indicating UTC).

java.time

Инфраструктура java.time встроена в Java 8 и более поздние версии. Эти классы вытесняют старые проблемные классы даты и времени, такие как java.util.Date, .Calendar, java.text.SimpleDateFormat, java.sql.Date, и многое другое. Команда Joda-Time также советует перейти на java.time.

Instant

Класс Instant представляет момент на временной шкале в UTC с разрешением до наносекунд.

long mnSeconds = … ;
long mnNanoseconds = … ;

Instant instant = Instant.ofEpochSecond( mnSeconds ).plusNanos( mnNanoseconds );

Или передать оба номера в of, как два аргумента. Другой синтаксис, тот же результат.

Instant instant = Instant.ofEpochSecond( mnSeconds , mnNanoseconds );

Чтобы получить строку, представляющую это значение даты и времени, вызовите Instant::toString.

String output = instant.toString();

Вы получите значение, например 2011-12-03T10:15:30.987654321Z, стандартный формат ISO 8601. Замените T пробелом, если хотите. Для других форматов выполните поиск, чтобы узнать о DateTimeFormatter.


О java.time

Инфраструктура java.time встроена в Java 8 и более поздние версии. Эти классы вытеснять неприятные старые устаревшие классы даты и времени, такие как java.util.Date, Calendar, и SimpleDateFormat.

Проект Joda-Time, находящийся сейчас в режиме обслуживания, рекомендует перейти на классы java.time.

Чтобы узнать больше, см. Учебник по Oracle. И поиск для многих примеров и объяснений. Спецификация JSR 310.

Вы можете обмениваться объектами java.time напрямую с вашей базой данных. Используйте драйвер JDBC, соответствующий JDBC 4.2 или более поздней версии. Нет необходимости в строках, нет необходимости в java.sql.*.

Где взять классы java.time?

Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Здесь вы можете найти некоторые полезные классы, такие как Interval, YearWeek, YearQuarter и другие.

Ответ 4

java.util.Date класс имеет конструктор, который принимает эпоху milliSeconds.

Отметьте java doc и попытайтесь использовать его.

Ответ 5

Это немного зависит от значений mnSeconds и mnNanoseconds, но все, что вам нужно сделать с форматом, подобным этому (с миллисекундной точностью), заключается в создании java.util.Date. Если mnNanoseconds - это количество наносекунд поверх ваших mnSeconds, я бы предположил, что это что-то вроде

Date d = new Date(mnSeconds*1000+mnNanosecods/1000000)

Затем это нужно форматировать его с помощью форматирования перед его печатью.

Ответ 6

Вы можете использовать

new java.util.Date(mnSeconds);

а затем SimpleDateFormat для форматирования вывода.

Наносекунды не поддерживаются датой. Вам нужно вручную добавить Nanoseconds или использовать некоторую фреймворк (есть ли он?).