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 ().
private String getDateString(long timeInMilliseconds) { SimpleDateFormat formatter = new SimpleDateFormat("EEE, d MMM yyyy 'at' HH:mm:ss z"); return formatter.format(timeInMilliseconds); }
Odpowiedzi:
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);
źródło
java.util.Date
,java.util.Calendar
ijava.text.SimpleDateFormat
są teraz starsze , zastąpione przez klasy java.time wbudowane w Javę 8 i nowsze. Zobacz samouczek firmy Oracle .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/
źródło
java.time
Korzystanie z
java.time
frameworka 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
ZonedDateTime
jest oznaczyć ją jako datę w strefie czasowej UTC , ponieważ Epoka jest zdefiniowana w UTC w czasie uniksowym używanym przez Javę.ZoneOffset
zawiera przydatną stałą dla strefy czasowej UTC, jak widać w ostatnim wierszu powyżej. Jego superklasaZoneId
może służyć do przystosowania się do innych stref czasowych.ZoneId zoneId = ZoneId.of( "America/Montreal" );
źródło
LocalDateTime
i po prostu pokazaćZonedDateTime
. W większości aplikacji biznesowychZonedDateTime
jest to najlepsza droga. Ludzie mają tendencję do wpadania w kłopoty / zamieszanie zLocalXXX
typami.long timestamp = Long.parseLong(date) Date expiry = new Date(timestamp * 1000)
źródło
Jeszcze lepiej, użyj JodaTime . O wiele łatwiej jest analizować ciągi i tworzyć ciągi. Jest również bezpieczny dla wątków. Warto poświęcić czas na jego wdrożenie.
źródło
Konwersja sekundowego znacznika czasu na milisekundowy znacznik czasu. Możesz użyć TimeUnit API i tak schludnie.
long milliSecondTimeStamp = MILLISECONDS.convert(secondsTimeStamp, SECONDS)
źródło
Hum ... jeśli się nie mylę, czas Epoki UNIX jest właściwie tym samym, co
Więc piszę
try { Date expiry = new Date(Long.parseLong(date)); } catch(NumberFormatException e) { // ... }
powinien działać (i być znacznie szybszy podczas analizowania daty)
źródło