Używasz kłopotliwych starych klas daty i godziny teraz wypieranych przez klasy java.time.
Błędne dane wejściowe
Twój pierwszy przykład ciąg jest nieprawidłowy, jako 21-to nie poniedziałek wtorek. Drugi przykładowy ciąg z 22. jest poprawny i użyty w moim przykładowym kodzie poniżej.
Korzystanie java.time
Należy unikać używania tego rodzaju formatu reprezentacji tekstowych wartości daty i godziny. W szczególności nigdy nie należy używać skrótu o długości 3-4 liter, takiego jak EST
lub IST
widziane w tego rodzaju formacie, ponieważ nie są to prawdziwe strefy czasowe, nie są ustandaryzowane, a nawet unikalne (!). Podaj proper time zone name. W tym konkretnym przypadku java.time jest w stanie przetłumaczyć to jako GMT
jako UTC, ale inne wartości mogą zawieść.
String input = "Tue May 22 14:52:00 GMT 2012";
DateTimeFormatter f = DateTimeFormatter.ofPattern ("EEE MMM dd HH:mm:ss z uuuu").withLocale (Locale.US);
ZonedDateTime zdt = ZonedDateTime.parse (input , f);
System.out.println ("zdt: " + zdt);
Zrzut na konsolę. Metoda toString
generuje ciąg w standardowym formacie ISO 8601, rozszerzony przez dodanie nazwy strefy w nawiasach. Te standardowe formaty są znacznie lepszym wyborem, gdy trzeba serializować wartości daty i godziny do tekstu.
System.out.println ("zdt: " + zdt);
ZDT: 2012-05-22T14: 52Z [GMT]
Generowanie String
można wygenerować ciąg do reprezentowania tej wartości w dowolnym formacie pragnienie. Ogólnie najlepiej, aby java.time lokalizował się automatycznie, używając Locale
i DateTimeFormatter
.
Pożądany format wykorzystuje styl średniej długości dla części daty, ale styl krótkiej długości dla porcji dnia. Na szczęście model DateTimeFormatter
umożliwia zlokalizowanie każdej części osobno, jak widać tutaj, gdzie przekazujemy parę obiektów FormatStyle
.
Locale l = Locale.US; // Or Locale.CANADA_FRENCH, or Locale.ITALY, etc.
DateTimeFormatter fOutput = DateTimeFormatter.ofLocalizedDateTime (FormatStyle.MEDIUM , FormatStyle.SHORT).withLocale (l);
String output = zdt.format (fOutput);
Zrzut na konsolę.
System.out.println ("zdt: " + zdt + " | output: " + output);
ZDT: 2012-05-22T14: 52Z [GMT] | Wyjście: Maj 22, 2012 14:52
O java.time
Ramy java.time jest wbudowana w Java 8 i późniejszych. Klasy te zastępują stare, kłopotliwe klasy czasu i daty, takie jak java.util.Date
, .Calendar
, java.text.SimpleDateFormat
.
Projekt Joda-Time, teraz w maintenance mode, zaleca migrację do java.time. Aby uzyskać więcej informacji, zobacz
. I wyszukaj Stack Overflow dla wielu przykładów i objaśnień.
Znaczna część funkcjonalności java.time powraca walcowy Java 6 & 7 w ThreeTen-Backport i ponadto dostosowany do Android w ThreeTenABP (patrz How to use…).
Projekt ThreeTen-Extra rozszerza java.time o dodatkowe klasy. 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 więcej.
Jaki jest wyjątek? –
jaki był wyjątek? – Jeshurun
Twój przykładowy tekst do góry to 21, czyli poniedziałek, a nie wtorek. Różni się od przykładowego kodu. –