Mam ciąg daty i chcę go parsować do normalnej daty, używając interfejsu Java Date API, oto mój kod:
public static void main(String[] args) {
String date="2010-10-02T12:23:23Z";
String pattern="yyyy-MM-ddThh:mm:ssZ";
SimpleDateFormat sdf=new SimpleDateFormat(pattern);
try {
Date d=sdf.parse(date);
System.out.println(d.getYear());
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Mam jednak wyjątek: java.lang.IllegalArgumentException: Illegal pattern character 'T'
Zastanawiam się więc, czy muszę podzielić ciąg i przeanalizować go ręcznie?
BTW, próbowałem dodać pojedynczy znak cudzysłowu po obu stronach litery T:
String pattern="yyyy-MM-dd'T'hh:mm:ssZ";
To też nie działa.
java
date
simpledateformat
iso8601
hguser
źródło
źródło
T
Stoi na czas i jest częścią ISO8601 normą data międzynarodowego czasie formatowania.T
pojedynczych cudzysłowów działało dla mnie (przynajmniej pod względem rozwiązania błędu analizy).Odpowiedzi:
Aktualizacja dla Java 8 i nowszych
Teraz możesz po prostu zrobić
Instant.parse("2015-04-28T14:23:38.521Z")
i uzyskać poprawną rzecz, zwłaszcza że powinieneś używaćInstant
zamiast zepsutegojava.util.Date
z najnowszymi wersjami Javy.Powinieneś używać
DateTimeFormatter
zamiastSimpleDateFormatter
.Oryginalna odpowiedź:
Działa to z danymi wejściowymi ze znakiem końcowym,
Z
jak pokazano:Q2597083.java
Daje następujące dane wyjściowe:
źródło
tl; dr
Użyj
java.time.Instant
klasy do parsowania tekstu w standardowym formacie ISO 8601, reprezentującym chwilę w UTC.ISO 8601
Ten format jest zdefiniowany przez normę ISO 8601 dla formatów ciągów daty i godziny.
Obie:
… Domyślnie używają formatów ISO 8601 do analizowania i generowania ciągów.
Ogólnie powinieneś unikać korzystania ze starych klas java.util.Date /.Calendar & java.text.SimpleDateFormat, ponieważ są one wyjątkowo kłopotliwe, mylące i wadliwe. Jeśli jest to wymagane do współpracy, możesz konwertować do iz powrotem.
java.time
Zbudowana w Javie 8 i nowszych jest nowa platforma java.time . Zainspirowany przez Joda-Time , zdefiniowany przez JSR 310 i rozszerzony przez projekt ThreeTen-Extra .
Przejdź do starej klasy.
Strefa czasowa
W razie potrzeby możesz przypisać strefę czasową.
Konwertować.
Joda-Time
AKTUALIZACJA: Projekt Joda-Time jest teraz w trybie konserwacji. Zespół doradza migrację do klas java.time .
Oto przykładowy kod w Joda-Time 2.8.
Konwertuj na starą klasę. Pamiętaj, że przypisana strefa czasowa jest tracona podczas konwersji, ponieważ juDate nie można przypisać strefy czasowej.
Strefa czasowa
W razie potrzeby możesz przypisać strefę czasową.
O java.time
Środowisko java.time jest wbudowane w Javę 8 i nowsze wersje . Klasy te kłopotliwe zastąpić stary starszych klas Date-Time, takich jak
java.util.Date
,Calendar
, iSimpleDateFormat
.Projekt Joda-Time , teraz w trybie konserwacji , zaleca migrację do klas java.time .
Aby dowiedzieć się więcej, zobacz samouczek Oracle . I przeszukaj stos przepełnienia dla wielu przykładów i wyjaśnień. Specyfikacja to JSR 310 .
Możesz wymieniać obiekty java.time bezpośrednio ze swoją bazą danych. Użyj sterownika JDBC zgodnego z JDBC 4.2 lub nowszym. Nie potrzeba ciągów, nie ma potrzeby
java.sql.*
klas.Gdzie można uzyskać klasy java.time?
Projekt ThreeTen-Extra rozszerza java.time o dodatkowe klasy. Ten projekt jest poligonem doświadczalnym dla ewentualnych przyszłych dodatków do java.time. Można znaleźć kilka przydatnych klas tutaj takie jak
Interval
,YearWeek
,YearQuarter
, i więcej .źródło
Do tej pory istnieją dwie odpowiedzi i obie są długie (i tl; dr za krótkie IMHO), więc piszę podsumowanie z mojego doświadczenia, zaczynając korzystać z nowej biblioteki java.time (dotyczy to, jak wspomniano w innych odpowiedziach na wersję Java) 8+). ISO 8601 określa standardowy sposób zapisywania dat:
YYYY-MM-DD
więc format daty i godziny jest tylko taki jak poniżej (może to być 0, 3, 6 lub 9 cyfr dla milisekund) i nie jest wymagany ciąg formatujący:Nie potrzebowałem tego, ale ponieważ otrzymywanie roku jest w kodzie od pytania, to:
jest trudniejsze, nie można tego zrobić
Instant
bezpośrednio, można to zrobić zaCalendar
pomocą pytań Uzyskaj całkowitą wartość bieżącego roku w Javie i konwertowaniu Java. czas do kalendarza, ale IMHO ze względu na ustalony format podciąg jest prostszy w użyciu:źródło