2014-11-21 28 views
6

mam datę ciągKonwersja ISO8601 datę unix timestamp w Javie

String s = "2014-09-01T19:22:43.000Z"; 
    Date date = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ").parse(s); 

Ale otrzymuję wyjątek:

Exception in thread "main" java.text.ParseException: Unparseable date: "2014-09-01T19:22:43.000Z" 

Jak przekonwertować powyższy ciąg uniksowy znacznik czasu? Dzięki

+0

FYI, kłopotliwe stare klasy czasu i daty, takie jak ['java.util.Date'] (https://docs.oracle.com/javase/9/docs/api/java/util/Date.html) , ['java.util.Calendar'] (https://docs.oracle.com/javase/9/docs/api/java/util/Calendar.html) i' java.text.SimpleDateFormat' są teraz [starsze] (https://pl.wikipedia.org/wiki/Legacy_system), wypierane przez [java.time] (https://docs.oracle.com/javase/9/docs/api/ java/time/package-summary.html) klasy wbudowane w Java 8 i Java 9. Zobacz [Tutorial by Oracle] (https://docs.oracle.com/javase/tutorial/datetime/TOC.html). –

Odpowiedz

6

X służy do ISO 8601 time zone w SimpleDateFormat nie Z

Prawidłowy format jest "yyyy-MM-dd'T'HH:mm:ss.SSSX"

+1

Zdrap to. 'X' analizuje' Z' jako Zulu. –

6

tl; dr

Jak przekonwertować powyższy ciąg uniksowy znacznik czasu?

Instant.parse("2014-09-01T19:22:43.000Z") 
     .getEpochSecond() 

java.time

Klasa java.time.Instant można analizować swój ciąg wejściowy z jego standardowym formacie ISO 8601. Nie trzeba określać wzorca formatowania.

Instant instant = Instant.parse("2014-09-01T19:22:43.000Z"); 

Aby uzyskać liczbę milisekund od epoki 1970:

long millisecondsSinceUnixEpoch = instant.toEpochMilli() ; 

dla całych sekund od epoki 1970-01-01T00: 00: 00Z:

long secondsSinceUnixEpoch = instant.getEpochSecond() ; 

Be świadomy możliwej utraty danych podczas przechodzenia do milisekund lub całych sekund. Klasy java.time mają rozdzielczość nanosekundową, więc wszelkie mikrosekundy lub nanosekundy obecne w wartości będą obcięte.

Joda-Time

Aktualizacja Projekt Joda-Time jest teraz w trybie konserwacji. Zespół zaleca migrację do klas java.time.

Dzięki bibliotece Joda-Time ta praca jest łatwiejsza. Twój ciąg zgodny z ISO 8601 może być podawany bezpośrednio do konstruktora Joda-Time. Wbudowany parser oczekuje ISO 8601.

DateTime dateTime = new DateTime("2014-09-01T19:22:43.000Z") ; 

Unix Timestamp

Co masz na myśli przez timestamp Unix? Niektórzy ludzie liczą całe sekundy od pierwszej chwili 1970 roku UTC (Unix epoch) podczas ignorowania sekund przestępnych (patrz Unix Time). Niektórzy ludzie oznaczają liczbę milisekund lub inną rozdzielczość.

Należy zwrócić uwagę na użycie prymitywu long zamiast bardziej powszechnego int.

Dla milisekund, zadzwoń pod numer getMillis().

long millisecondsSinceUnixEpoch = dateTime.getMillis(); 

Przez całe sekundy podziel przez 1000. Zastanów się, czy chcesz zaokrąglić lub skrócić ułamkowe sekundy.


Zazwyczaj sugerowałbym przekazanie obiektu DateTimeZone wraz z łańcuchem do konstruktora DateTime. Ale nie ma potrzeby, jeśli wszystko, co chcesz, to liczenie od epoki.


O java.time

Ramy java.time jest wbudowana w Java 8 i późniejszych. Te klasy zastępują kłopotliwe stare klasy dat-czasu, takie jak java.util.Date, Calendar, & SimpleDateFormat.

Projekt Joda-Time, teraz w maintenance mode, zaleca migrację do klas java.time. Aby uzyskać więcej informacji, zobacz

. I wyszukaj Stack Overflow dla wielu przykładów i objaśnień. Specyfikacja to JSR 310.

Gdzie można uzyskać lekcje java.time?

  • Java SE 8, Java SE 9, a później
    • wbudowanej.
    • Część standardowego interfejsu API języka Java z pakietem implementacji.
    • Java 9 dodaje kilka drobnych funkcji i poprawek.
  • Java SE 6 i Java SE 7
    • Znaczna część funkcjonalności java.time jest back-przeniesiony do Java 6 & 7 w ThreeTen-Backport.
  • Android
    • Późniejsze wersje Androida wdrożeń wiązce klas java.time.
    • Dla wcześniejszego systemu Android projekt ThreeTenABP dostosowuje ThreeTen-Backport (wymieniony powyżej). Zobacz How to use ThreeTenABP….

Projekt ThreeTen-Extra rozciąga java.time z dodatkowych zajęć. Ten projekt jest poligonem wskazującym na możliwe przyszłe dodatki do java.time. Możesz znaleźć tutaj kilka użytecznych klas, takich jak Interval, YearWeek, YearQuarter i more.