On 19/05/2008, Christopher Schultz <[EMAIL PROTECTED]> wrote: > -----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. >
Could you please create a JIRA enhancement issue and attach the code there? Much easier to keep track of (and no formatting issues!). Thanks!. > ====================== > > 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] > > --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]