-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 All,
Christopher Schultz wrote: | Hi, I'm looking for an implementation of a String->Date converter for | xs:dateTime, which has an odd format. It's not directly supportable by | java.text.SimpleDateFormat and looks like a regular expression is the | only way to go. | | Does anyone have an implementation they'd care to share, or any tips in | particular? I'd be glad to share whatever I come up with if there isn't | anything already out there. As I received no useful replies, I'll assume that there is still a need for such capability. Here is the implementation that I developed. Oddly, it seems that sometimes the TimeZone is incorrectly set (though the normalized time appears to be correct) in the resulting Date. Any tips would be appreciated. Apologies for the poor formatting. ====================== public class XMLDateConverter ~ implements Converter { ~ private Converter _default; ~ public XMLDateConverter(Converter defaultConverter) ~ { ~ _default = defaultConverter; ~ } ~ public Object convert(Class type, Object value) ~ throws ConversionException ~ { ~ if(type.isAssignableFrom(Date.class) ~ && value instanceof String) ~ { ~ try ~ { ~ return parseXMLDateTime((String)value); ~ } ~ catch (ParseException pe) ~ { ~ throw new ConversionException("Cannot parse date", pe); ~ } ~ } ~ else if(null != _default) ~ { ~ return _default.convert(type, value); ~ } ~ else ~ { ~ throw new ConversionException("Don't know how to convert " + value + " (" + (null == value ? "null" : value.getClass().getName()) + ") to " + type.getName()); ~ } ~ } ~ private static final Pattern XS_DATETIME_PATTERN = Pattern.compile("([-]?[0- 9]{4,})-([0-9]{2})-([0-9]{2})T([0-9]{2}):([0-9]{2}):([0-9]{2})(.([0-9]{1,3}))?(( ?:[+-]?[0-9]{2}:[0-9]{2})|Z)?"); ~ private static Date parseXMLDateTime_regexp(String dateTime) ~ throws ParseException ~ { ~ Matcher m = XS_DATETIME_PATTERN.matcher(dateTime); ~ if(!m.matches()) ~ throw new ParseException("Unparsable date: " + dateTime, -1); ~ Calendar date = Calendar.getInstance(); ~ date.set(Calendar.YEAR, Integer.parseInt(m.group(1))); ~ date.set(Calendar.MONTH, Integer.parseInt(m.group(2)) - 1); // Stupid! ~ date.set(Calendar.DATE, Integer.parseInt(m.group(3))); ~ date.set(Calendar.HOUR_OF_DAY, Integer.parseInt(m.group(4))); ~ date.set(Calendar.MINUTE, Integer.parseInt(m.group(5))); ~ date.set(Calendar.SECOND, Integer.parseInt(m.group(6))); ~ if(null == m.group(7)) ~ date.set(Calendar.MILLISECOND, 0); ~ else ~ date.set(Calendar.MILLISECOND, Integer.parseInt(m.group(8))); ~ int zoneOffset; ~ String timezone = m.group(9); ~ if(null == timezone ~ || "Z".equals(timezone)) ~ { ~ zoneOffset = 0; ~ } ~ else ~ { ~ int pos = timezone.indexOf(':'); ~ zoneOffset = ((60 * Integer.parseInt(timezone.substring(1, pos))) ~ + Integer.parseInt(timezone.substring(pos + 1))) ~ * 60 * 1000 ~ ; ~ if(timezone.startsWith("-")) ~ zoneOffset = -zoneOffset; ~ } ~ date.set(Calendar.ZONE_OFFSET, zoneOffset); ~ return date.getTime(); ~ } } - -chris -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.9 (MingW32) Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org iEYEARECAAYFAkgxsHMACgkQ9CaO5/Lv0PDZrQCeMpFaaP3tfhNgtCjn5Qi/+8t/ OcIAni0ot3GbZfaM4NFzbFQCjr5JzHwW =zDdg -----END PGP SIGNATURE----- --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]