Час епохи Unix до об'єкта Java Date


84

У мене є рядок, що містить час 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

Відповіді:


125

Як щодо просто:

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

EDIT: відповідно до відповіді rde6173 та уважнішого розгляду вхідних даних, заданих у питанні, "1081157732" видається значенням епохи, яке базується на секундах, тому ви хочете помножити long з parseLong () на 1000 для перетворення до мілісекунд, тобто те, що використовує конструктор дати Java, отже:

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

4
Чи не буде це технічно неправильним, оскільки не враховує високосних секунд?
Maciej Piechotka

1
Мацей, "заснована на секундах" епоха Опа вже складає високосні секунди, вона базується на "секундах". Тож ця відповідь правильна.
thecarpy

1
Це дає мені неправильні значення, якщо їх помножити на 1000, чи немає кращого способу це зробити?
Ishaan

1
FYI, страшенно клопітні старі класи часу та часу, такі як java.util.Date, java.util.Calendarі java.text.SimpleDateFormatтепер є застарілими , витіснені класами java.time, вбудованими в Java 8 та пізніші версії. Див. Підручник Oracle .
Василь Бурке

Питання було з часів епохи, тобто 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, це не перевірено як відповідь :)
Маккі

Дякую за цю відповідь. Я сидів тут, намагаючись створити інстанцію дати епохи, і результат завжди був якось в 1970 році, і це тому, що я несвідомо давав Java мілісекунди, а не секунди :)
Ло-Тан

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, оскільки Епоха визначена в UTC у часі Unix, який використовує Java.

ZoneOffsetмістить зручну константу для часового поясу UTC, як видно з останнього рядка вище. Його суперклас ZoneIdможна використовувати для переходу в інші часові пояси.

ZoneId zoneId = ZoneId.of( "America/Montreal" );

Гарна відповідь. Я б запропонував скинути LocalDateTimeі просто показати a ZonedDateTime. У більшості бізнес-додатків ZonedDateTimeце найкращий спосіб. Люди, як правило, потрапляють у неприємності / плутанину з LocalXXXтипами.
Basil Bourque


0

А ще краще, використовуйте JodaTime . Набагато простіший синтаксичний розбір рядків і рядків. Також безпечний для ниток. Варто витратити час на його реалізацію.


FYI, проект Joda-Time зараз перебуває в режимі технічного обслуговування , і команда радить перехід на класи java.time . Див. Підручник Oracle .
Василь Бурке

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 вимірюється секундами, а не мілісекундами.
Саймон Нікерсон,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.