Время эпохи Unix для объекта Java Date

85

У меня есть строка, содержащая время UNIX Epoch , и мне нужно преобразовать ее в объект Java Date.

String date = "1081157732";
DateFormat df = new SimpleDateFormat(""); // This line
try {
  Date expiry = df.parse(date);
 } catch (ParseException ex) {
  ex.getStackTrace();
}

Отмеченная линия - это то место, где у меня проблема. Я не могу понять, каким должен быть аргумент SimpleDateFormat (), и даже если я должен использовать SimpleDateFormat ().

Ксенф Ян
источник
См. Мой подробный ответ на аналогичный вопрос о преобразовании миллисекунд в дату и время с помощью примера кода с использованием библиотеки Joda-Time.
Basil Bourque
private String getDateString(long timeInMilliseconds) { SimpleDateFormat formatter = new SimpleDateFormat("EEE, d MMM yyyy 'at' HH:mm:ss z"); return formatter.format(timeInMilliseconds); }
JVJplus 06

Ответы:

129

Как насчет только:

Date expiry = new Date(Long.parseLong(date));

РЕДАКТИРОВАТЬ: в соответствии с ответом rde6173 и более пристальным взглядом на ввод, указанный в вопросе, «1081157732», по-видимому, представляет собой значение эпохи на основе секунд, поэтому вы хотите умножить long из parseLong () на 1000, чтобы преобразовать в миллисекунды, что и использует конструктор Date в Java, поэтому:

Date expiry = new Date(Long.parseLong(date) * 1000);
Марк Новаковски
источник
4
Разве это не было бы технически некорректно, так как не учитывались прыжковые секунды?
Maciej Piechotka
1
Мацей, «секундная» эпоха op уже учитывает високосные секунды, она основана на «секундах». Итак, это правильный ответ.
thecarpy
1
При умножении на 1000 он дает неверные значения, разве нет лучшего способа сделать это?
Ishaan
1
К вашему сведению, ужасно неприятные старые классы даты и времени, такие как java.util.Date, java.util.Calendarи java.text.SimpleDateFormat, теперь унаследованы , вытеснены классами java.time, встроенными в Java 8 и новее. См. Учебник Oracle .
Basil Bourque
Вопрос был в том, что с эпохой, которая является UTC, в то время как дата ожидает, что долгое время будет от GMT, они одинаковы?
Люк,
37

Эпоха - это количество секунд с 1 января 1970 г.

Так:

String epochString = "1081157732";
long epoch = Long.parseLong( epochString );
Date expiry = new Date( epoch * 1000 );

Для получения дополнительной информации: http://www.epochconverter.com/

Райан Эмерл
источник
1
Это работает ... IDK Y, это не было проверено как ответ :)
Makky
Спасибо за этот ответ. Я сидел здесь, пытаясь создать экземпляр даты из эпохи, и результат всегда был когда-нибудь в 1970 году, и это было потому, что я неосознанно давал Java миллисекунды, а не секунды :)
Lo-Tan
24

java.time

Использование java.timeфреймворка, встроенного в Java 8 и новее.

import java.time.LocalDateTime;
import java.time.Instant;
import java.time.ZoneId;

long epoch = Long.parseLong("1081157732");
Instant instant = Instant.ofEpochSecond(epoch);
ZonedDateTime.ofInstant(instant, ZoneOffset.UTC); # ZonedDateTime = 2004-04-05T09:35:32Z[UTC]

В этом случае вам лучше использовать, ZonedDateTimeчтобы пометить его как дату в часовом поясе UTC, потому что Epoch определяется в UTC во времени Unix, используемом Java.

ZoneOffsetсодержит удобную константу для часового пояса UTC, как показано в последней строке выше. Его суперкласс ZoneIdможно использовать для адаптации к другим часовым поясам.

ZoneId zoneId = ZoneId.of( "America/Montreal" );
Przemek
источник
Хороший ответ. Я бы посоветовал бросить LocalDateTimeи просто показать ZonedDateTime. В большинстве бизнес-приложений ZonedDateTimeэто лучший способ. Люди склонны ввязываться в проблемы / путаницу с LocalXXXтипами.
Basil Bourque
7
long timestamp = Long.parseLong(date)
Date expiry = new Date(timestamp * 1000)
tcurdt
источник
0

А еще лучше использовать JodaTime . Намного проще анализировать строки и разбивать их на строки. Также является потокобезопасным. Стоит потратить время на его реализацию.

Человек-ВолкДракон
источник
К вашему сведению, проект Joda-Time сейчас находится в режиме обслуживания , и команда советует перейти на классы java.time . См. Учебник Oracle .
Basil Bourque
0

Чтобы преобразовать отметку времени секунд в отметку времени миллисекунды. Вы можете использовать API TimeUnit и вот так аккуратно.

long milliSecondTimeStamp = MILLISECONDS.convert(secondsTimeStamp, SECONDS)

Динеш Джаябалан
источник
-1

Хм .... если я не ошибаюсь, время UNIX Epoch на самом деле то же самое, что

System.currentTimeMillis()

Так пишу

try {
    Date expiry = new Date(Long.parseLong(date));
}
catch(NumberFormatException e) {
    // ...
}

должен работать (и быть намного быстрее, чем синтаксический анализ даты)

Вархан
источник
4
Обычно эпоха Unix измеряется в секундах, а не в миллисекундах.
Саймон Никерсон