Czas epoki uniksowej do obiektu Java Date

84

Mam ciąg znaków zawierający godzinę UNIX Epoch i muszę przekonwertować go na obiekt Java Date.

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

Zaznaczona linia to miejsce, w którym mam problem. Nie mogę zrozumieć, jaki powinien być argument do SimpleDateFormat (), a nawet czy powinienem używać SimpleDateFormat ().

Xenph Yan
źródło
Zobacz moją szczegółową odpowiedź na podobne pytanie dotyczące konwersji milisekund na datę i godzinę z przykładowym kodem przy użyciu biblioteki 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

Odpowiedzi:

125

Może po prostu:

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

EDYTUJ: zgodnie z odpowiedzią rde6173 i po bliższym przyjrzeniu się wpisowi podanemu w pytaniu, „1081157732” wydaje się być wartością epoki opartą na sekundach, więc warto pomnożyć długość z parseLong () przez 1000, aby przekonwertować do milisekund, z czego korzysta konstruktor Date w Javie, więc:

Date expiry = new Date(Long.parseLong(date) * 1000);
Marc Novakowski
źródło
4
Czy nie byłoby to technicznie niepoprawne, ponieważ nie uwzględnia sekund przestępnych?
Maciej Piechotka
1
Macieja, epoka "sekundowa" opów obejmuje już sekundy przestępne, jest oparta na "sekundach". Więc ta odpowiedź jest poprawna.
thecarpy
1
Po pomnożeniu przez 1000 daje mi nieprawidłowe wartości, czy nie ma lepszego sposobu na zrobienie tego?
Ishaan
1
FYI, strasznie kłopotliwe stare klasy daty i godziny, takie jak java.util.Date, java.util.Calendari java.text.SimpleDateFormatsą teraz starsze , zastąpione przez klasy java.time wbudowane w Javę 8 i nowsze. Zobacz samouczek firmy Oracle .
Basil Bourque
Pytanie brzmiało, skoro epoka, którą jest UTC, podczas gdy data spodziewa się, że długo będzie od GMT, czy są one takie same?
Łukasz
37

Epoka to liczba sekund od 1 stycznia 1970 r.

Więc:

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

Więcej informacji: http://www.epochconverter.com/

Ryan Emerle
źródło
1
To działa
niewiarygodnie
Dziękuję za tę odpowiedź. Siedziałem tutaj, próbując określić datę z jakiejś epoki, a rezultatem był zawsze jakiś dzień w 1970 roku, a to dlatego, że nieświadomie podawałem Java milisekundy, a nie sekundy :)
Lo-Tan
24

java.time

Korzystanie z java.timeframeworka wbudowanego w Javę 8 i nowszych.

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]

W takim przypadku lepiej ZonedDateTimejest oznaczyć ją jako datę w strefie czasowej UTC , ponieważ Epoka jest zdefiniowana w UTC w czasie uniksowym używanym przez Javę.

ZoneOffsetzawiera przydatną stałą dla strefy czasowej UTC, jak widać w ostatnim wierszu powyżej. Jego superklasa ZoneIdmoże służyć do przystosowania się do innych stref czasowych.

ZoneId zoneId = ZoneId.of( "America/Montreal" );
Przemek
źródło
Dobra odpowiedź. Proponuję porzucić LocalDateTimei po prostu pokazać ZonedDateTime. W większości aplikacji biznesowych ZonedDateTimejest to najlepsza droga. Ludzie mają tendencję do wpadania w kłopoty / zamieszanie z LocalXXXtypami.
Basil Bourque
7
long timestamp = Long.parseLong(date)
Date expiry = new Date(timestamp * 1000)
tcurdt
źródło
0

Konwersja sekundowego znacznika czasu na milisekundowy znacznik czasu. Możesz użyć TimeUnit API i tak schludnie.

long milliSecondTimeStamp = MILLISECONDS.convert(secondsTimeStamp, SECONDS)

Dinesh Jayabalan
źródło
-1

Hum ... jeśli się nie mylę, czas Epoki UNIX jest właściwie tym samym, co

System.currentTimeMillis()

Więc piszę

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

powinien działać (i być znacznie szybszy podczas analizowania daty)

Varkhan
źródło
4
Zwykle czas epoki systemu Unix jest mierzony w sekundach, a nie w milisekundach.
Simon Nickerson,