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]