-----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]

Reply via email to