Hi,
(Clocks change, cue bugs in my code surfacing).
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