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

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

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

Мой ввод:

long mnSeconds;
long mnNanoseconds;

Где сумма двух - это время, прошедшее с эпохи 1970-01-01 00:00:00.0.


person user1585643    schedule 08.08.2012    source источник
comment
См. этот вопрос, вы сможете изменить его для твои нужды   -  person ProfessionalAmateur    schedule 08.08.2012


Ответы (6)


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

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);
}

e.g.

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));
}
person Peter Lawrey    schedule 08.08.2012
comment
Это то, что я бы сделал, за исключением того, что формат, в котором он хочет, не выводит более миллисекунд (.SSS), так что последний вызов String.format() является нежелательным. - person Fredrik; 08.08.2012
comment
Отличный ответ - и БЫСТРО! Спасибо. Фредрик, это действительно ms - это то, что + String.format(%09d, mnNanoseconds); часть делает! - person user1585643; 09.08.2012
comment
@user1585643 user1585643 ты упустил мою мысль. Эта часть измеряет миллисекунды И микросекунды и наносекунды. Строка формата в вопросе имеет только миллисекунды (три десятичных знака), поэтому я предположил, что это то, что вам нужно, а не девять знаков после запятой. - person Fredrik; 09.08.2012
comment
@ user1585643 В вопросе неясно, нужны ли вам миллисекунды, микросекунды или наносекунды. Это совсем не одно и то же. Кстати, я склонен записывать и отображать микросекунды в своих системах, так как получить что-то более точное, чем это, очень сложно. - person Peter Lawrey; 09.08.2012

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

long epoch = System.currentTimeMillis();

System.out.println("Epoch : " + (epoch / 1000));
person ProfessionalAmateur    schedule 08.08.2012
comment
Отображает текущие секунды с начала эпохи. Это не по теме. - person Adam Zalcman; 08.08.2012
comment
Да, я почему-то совершенно неправильно понял вопрос, подумал, что он спрашивает секунды. - person ProfessionalAmateur; 08.08.2012
comment
Полностью согласен, что не по теме, но это то, что я искал, и один из первых результатов был здесь. Мой запрос был временем эпохи Java, и моя цель состояла в том, чтобы получить текущее время эпохи - person Paul; 09.01.2014

tl;dr

    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.время

Платформа 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 на ПРОБЕЛ, если хотите. Для других форматов выполните поиск в Stack Overflow, чтобы узнать о DateTimeFormatter.


О java.time

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

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

Чтобы узнать больше, см. Учебное пособие по Oracle. И поищите множество примеров и пояснений в Stack Overflow. Спецификация: JSR 310.

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

Где получить классы java.time?

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

person Basil Bourque    schedule 25.05.2015

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

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

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

person Fredrik    schedule 08.08.2012


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

new java.util.Date(mnSeconds);

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

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

person John Smith    schedule 08.08.2012
comment
OP требует только миллисекунды, а java.util.Date поддержите это. Нет необходимости в дополнительных фреймворках. - person Adam Zalcman; 08.08.2012