tl; dr
ZonedDateTime.parse(
"Friday, September 26, 2008 8:30 PM Eastern Daylight Time" ,
DateTimeFormatter.ofPattern("EEEE, MMMM d, uuuu h:m a zzzz")
).getZone()
java.time
Nowoczesny sposób jest z klasami java.time. Pytanie i inne odpowiedzi wykorzystują kłopotliwe, stare, stare klasy czasu i czasu lub projekt Joda-Time, które są teraz wypierane przez klasy java.time.
Zdefiniuj obiekt DateTimeFormatter
za pomocą wzoru formatowania dopasowanego do danych.
DateTimeFormatter f = DateTimeFormatter.ofPattern("EEEE, MMMM d, uuuu h:m a zzzz");
Przypisywanie Locale
określić język ludzki dnia name-of-a nazwą miesiąca, jak również normy kulturowe dotyczące innych kwestii formatowania.
f = f.withLocale(Locale.US);
Wreszcie zrobić parsowania dostać ZonedDateTime
obiekt.
String input = "Friday, September 26, 2008 8:30 PM Eastern Daylight Time" ;
ZonedDateTime zdt = ZonedDateTime.parse(input , f);
zdt.toString(): 2008-09-26T20: 30-04: 00 [Ameryka/New_York]
Można prosić o strefie czasowej od ZonedDateTime
reprezentowanym jako obiekt ZoneId
. Następnie możesz przesłuchać numer ZoneId
, jeśli potrzebujesz więcej informacji o strefie czasowej.
ZoneId z = zdt.getZone();
See for yourself in IdeOne.com.
ISO 8601
Unikać wymiany danych daty i czasu w tego rodzaju strasznym formacie. Nie zakładaj języka angielskiego, nie dodawaj do niego swoich danych, takich jak nazwa dnia, i nigdy nie używaj pseudo-stref czasowych, takich jak Eastern Daylight Time
.
Dla stref czasowych: Określ proper time zone name w formacie continent/region
, takich jak America/Montreal
, Africa/Casablanca
lub Pacific/Auckland
. Nigdy nie używaj skrótu 3-4-literowego, takiego jak EST
lub IST
, ponieważ nie są one prawdziwymi strefami czasowymi, nie są ustandaryzowane, a nawet unikalne (!).
Do serializowania wartości daty i czasu do tekstu należy używać tylko formatów ISO 8601. Klasy java.time używają tych formatów domyślnie podczas analizowania/generowania ciągów znaków w celu przedstawienia ich wartości.
O java.time
Ramy java.time jest wbudowana w Java 8 i późniejszych. Klasy te zastępują kłopotliwe stare klasy z datami, takie jak java.util.Date
, Calendar
, & 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ń. Specyfikacja to JSR 310.
Gdzie można uzyskać lekcje java.time?
- Java SE 8 i 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 SE 7
- Znaczna część funkcjonalności java.time jest back-przeniesiony do Java 6 & 7 w ThreeTen-Backport.
- Android
- Projekt ThreeTenABP dostosowuje ThreeTen-backportu (wymienione powyżej) Androida szczegółowo.
- Zobacz How to use….
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.
czy masz rozwiązanie tego problemu? – Chin2
Odnośnie ostatniego akapitu, klasy "Date" i "Kalendarz" to krwawy bałagan: źle zaprojektowane, mylące i kłopotliwe. Unikaj ich. Zamiast tego należy użyć klas [java.time] (http://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html). –