2017-11-02 59 views
5

Staram parse ZonedDateTime s od Strings w następującym formacie:Wzór "YYYY-MM-DD HH: mm: ss Z" powoduje parsowania wyjątek gdzie Jodatime nie

2017-08-10 16:48:37 -0500

ja wcześniej wykonanej z powodzeniem korzystającym z Jodobime'a DateTimeFormat.forPattern("YYYY-MM-dd HH:mm:ss Z").

Próbuję zastąpić Jarestime interfejsem Java Time API i ten sam wzorzec już nie działa.

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("YYYY-MM-dd HH:mm:ss Z"); 
ZonedDateTime.parse("2017-08-10 16:48:37 -0500", dtf); 

skutkuje następującym wyjątkiem:

java.time.format.DateTimeParseException: Text '2017-08-10 16:48:37 -0500' could not be parsed: Unable to obtain ZonedDateTime from TemporalAccessor: {DayOfMonth=10, OffsetSeconds=-18000, WeekBasedYear[WeekFields[SUNDAY,1]]=2017, MonthOfYear=8},ISO resolved to 16:48:37 of type java.time.format.Parsed 

Jaki jest właściwy wzór do wykorzystania w ciągu formatu w Java API czasu?

Odpowiedz

6

Należy wymienić YYYY część z uuuu

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss Z"); 
    ZonedDateTime parsed = ZonedDateTime.parse("2017-08-10 16:48:37 -0500", dtf); 
+2

Ciekawe, co dokładnie jest różnica między 'year' (yyyy) i' lat-of-era' (uuuu)? –

+0

Sam nie potrafię tego dobrze wytłumaczyć. Ale zwróć uwagę, że: * u rok * y rok-z-ery * Rok bazujący na Y https://docs.oracle.com/javase/8/docs/api/java/time/format/ DateTimeFormatter.html –

+2

** y ** = rok, ** Y ** = rok w roku. Jeśli używa się ** numeru tygodnia ** (1-53), pierwsze pół tygodnia tego roku 2017 może wynosić 52, podczas gdy jego ** tygodniowy rok ** byłby poprzedni rok 2016. –