I've committed a change to handle this case. Stephen Stephen Colebourne wrote: > Your analysis is correct. The pattern string is merely a shorthand > suitable for compatibility with SimpleDateFormat. As you note, the 'Z' > in the pattern doesn't permit parsing of the letter 'Z' as +00:00. > > As you also note, this functionality is supported by the > DateTimeFormatter class. > > I would comment that so long as the pattern is used to print the zone, > then the parse will parse it back again (because it will use +00:00). > > Stephen > > > James Abley wrote: >> We are using joda-time 1.6 to persist a textual representation of a >> date, like so: >> >> String dateText = >> ISODateTimeFormat.basicDateTime().print(startDate.getTimeInMillis()); >> >> where startDate is a java.util.Calendar. >> >> So this is storing the string "20091030T100600.000Z", for example (the >> application is running in GMT). >> >> Later on, that field is retrieved, and we are trying to read the String >> back into a DateTime, then format for presentation on a web page. >> >> DateTimeFormatter formatter = >> DateTimeFormat.forPattern("yyyyMMdd'T'HHmmss.SSSZ"); // The pattern is >> specified externally >> String text = "20091030T100600.000Z"; // Read from persistent storage >> really. >> DateTime date = formatter.parseDateTime(text); >> // ... then format the DateTime according to the client's preferred style... >> >> This fails with: >> >> java.lang.IllegalArgumentException: Invalid format: >> "20091030T100600.000Z" is malformed at "Z" >> at >> org.joda.time.format.DateTimeFormatter.parseDateTime(DateTimeFormatter.java:673) >> >> So I wrote some characterization tests to aid my understanding of the API. >> >> /** >> * Passes. >> * >> * @throws Exception >> */ >> @Test >> public void roundTrippingOfJodaTimeDates() throws Exception { >> DateTimeFormatter formatter = ISODateTimeFormat.basicDateTime(); >> >> DateTime instant = new DateTime(2009, 10, 30, 10, 6, 0, 0); >> String now = formatter.print(instant.getMillis()); >> >> assertEquals("20091030T100600.000Z", now); >> >> DateTime rehydrated = formatter.parseDateTime(now); >> >> assertEquals(instant, rehydrated); >> } >> >> /** >> * This test passes. >> * >> * @throws Exception >> */ >> @Test >> public void >> parsingDateTimeWithExplicitPatternAndLongFormOfTimezone() throws Exception { >> DateTimeFormatter formatter = >> DateTimeFormat.forPattern("yyyyMMdd'T'HHmmss.SSSZ"); >> String text = "20091030T100600.000+00:00"; >> DateTime date = formatter.parseDateTime(text); >> assertNotNull(date); >> } >> >> /** >> * This test fails, when attempting to parseDateTime. >> * @throws Exception >> */ >> @Test >> public void >> parsingDateTimeWithExplicitPatternAndShortFormOfTimezone() throws >> Exception { >> DateTimeFormatter formatter = >> DateTimeFormat.forPattern("yyyyMMdd'T'HHmmss.SSSZ"); >> String text = "20091030T100600.000Z"; >> DateTime date = formatter.parseDateTime(text); >> assertNotNull(date); >> } >> >> AFAICT, the difference is that the formatter created in >> ISODateTimeFormat.basicDateTime() calls >> DateTimeFormatterBuilder.appendTimeZoneOffset(String, boolean, int, int) >> passing in "Z" as the zeroOffsetParameter, but when I call >> DateTimeFormat.forPattern(String), null gets passed into the same API >> method as the zeroOffsetText parameter. This test demonstrates that it >> is possible to construct a DateTimeFormatter which will happily parse >> the string, but I can't see a way of getting this without creating my >> own code to parse a pattern and create a DateTimeFormatter, which I'd >> like to avoid. >> >> /** >> * This passes, but I'd have to create my own parser to do this, >> which feels painful. >> * >> * @throws Exception >> */ >> @Test >> public void >> parsingDateTimeWithExplicitBuilderAndShortFormOfTimezone() throws >> Exception { >> DateTimeFormatter formatter = new DateTimeFormatterBuilder() >> .appendYear(4, 4) >> .appendMonthOfYear(2) >> .appendDayOfMonth(2) >> .appendLiteral('T') >> .appendHourOfDay(2) >> .appendMinuteOfHour(2) >> .appendSecondOfMinute(2) >> .appendLiteral('.') >> .appendSecondOfDay(3) >> .appendTimeZoneOffset("Z", false, 2, 2) >> .toFormatter(); >> String text = "20091030T100600.000Z"; >> DateTime date = formatter.parseDateTime(text); >> assertNotNull("Can cope with Z literal", date); >> >> text = "20091030T100600.000+00:00"; >> date = formatter.parseDateTime(text); >> assertNotNull("Can cope with offset", date); >> } >> >> Can anyone point out what I'm doing wrong? Why can't I round-trip the >> value in the way that I'm currently trying, using >> DateTimeFormat.forPattern(String) or similar? >> >> Regards, >> >> James >> >> >> ------------------------------------------------------------------------ >> >> ------------------------------------------------------------------------------ >> Come build with us! The BlackBerry(R) Developer Conference in SF, CA >> is the only developer event you need to attend this year. Jumpstart your >> developing skills, take BlackBerry mobile applications to market and stay >> ahead of the curve. Join us from November 9 - 12, 2009. Register now! >> http://p.sf.net/sfu/devconference >> >> >> ------------------------------------------------------------------------ >> >> _______________________________________________ >> Joda-interest mailing list >> Joda-interest@lists.sourceforge.net >> https://lists.sourceforge.net/lists/listinfo/joda-interest > > ------------------------------------------------------------------------------ > Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day > trial. Simplify your report design, integration and deployment - and focus on > what you do best, core application coding. Discover what's new with > Crystal Reports now. http://p.sf.net/sfu/bobj-july > _______________________________________________ > Joda-interest mailing list > Joda-interest@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/joda-interest >
------------------------------------------------------------------------------ Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day trial. Simplify your report design, integration and deployment - and focus on what you do best, core application coding. Discover what's new with Crystal Reports now. http://p.sf.net/sfu/bobj-july _______________________________________________ Joda-interest mailing list Joda-interest@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/joda-interest