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 ().


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

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/


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

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)


0

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

long milliSecondTimeStamp = MILLISECONDS.convert(secondsTimeStamp, SECONDS)


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


4
Zwykle czas epoki systemu Unix jest mierzony w sekundach, a nie w milisekundach.
— Simon Nickerson,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.