I need ISO8601 conversion with XStream for UTC (GMT/Zulu) time. Originally I went with ISO8601DateConverter which comes with XStream and uses Joda. However I found that it read in UTC (GMT/Zulu) time but wrote back out local time.
To fix this I wrote my own converter using JAXB in the JDK, and dropped the Joda runtime dependency from my project.
I unit tested full roundtrip with "2012-10-22T12:34:56Z". The original converter parsed correctly but serialized as "2012-10-22T07:34:56-05:00". My converter serializes as the input string.
import com.thoughtworks.xstream.converters.basic.AbstractSingleValueConverter;
import java.util.Date;
import java.util.GregorianCalendar;
import static java.util.TimeZone.getTimeZone;
import static javax.xml.bind.DatatypeConverter.parseDateTime;
import static javax.xml.bind.DatatypeConverter.printDateTime;
/**
* {@code UTCConverter} converts {@code java.util.Date} objects in ISO8601
* format for UTC without milliseconds.
*
* @author <a href="mailto:binkley@alumni.rice.edu">B. K. Oxley (binkley)</a>
*/
public final class UTCConverter
extends AbstractSingleValueConverter {
@Override
public boolean canConvert(final Class type) {
return Date.class.isAssignableFrom(type);
}
@Override
public String toString(final Object obj) {
final GregorianCalendar gmt = new GregorianCalendar(getTimeZone("GMT"));
gmt.setTime(Date.class.cast(obj));
return printDateTime(gmt);
}
@Override
public Object fromString(final String str) {
return parseDateTime(str).getTime();
}
}
No comments:
Post a Comment