/*
* Created on Jan 2, 2005 at the Interface Ecology Lab.
*/
package ecologylab.serialization.types.scalar;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import ecologylab.serialization.ScalarUnmarshallingContext;
import ecologylab.serialization.annotations.simpl_inherit;
import ecologylab.serialization.types.CrossLanguageTypeConstants;
/**
* Type system entry for {@link java.util.Date Date}.
*
* @author Zachary O. Toups (toupsz@cs.tamu.edu)
*/
@simpl_inherit
public class DateType extends ReferenceType<Date> implements CrossLanguageTypeConstants
{
static final String datePatterns[] =
{
"EEE MMM dd kk:mm:ss zzz yyyy",
"yyyy:MM:dd HH:mm:ss",
"yyyy:MM:dd HH:mm",
"yyyy-MM-dd HH:mm:ss",
"yyyy-MM-dd HH:mm",
"MMM dd, yyyy",
"yyyyMMdd",
"MM/dd/yyyy",
"MM/dd/yyyy K:mm aa",
};
static final DateFormat dateFormats[] = new DateFormat[datePatterns.length + 1];
static final DateFormat plainDf = DateFormat.getDateTimeInstance();
static
{
for (int i=0; i< datePatterns.length; i++)
dateFormats[i] = new SimpleDateFormat(datePatterns[i]);
dateFormats[datePatterns.length] = plainDf;
}
public DateType()
{
super(Date.class, JAVA_DATE, DOTNET_DATE, OBJC_DATE, null);
}
/**
* @param value
* is interpreted as a SimpleDateFormat in the form EEE MMM dd kk:mm:ss zzz yyyy (for
* example Wed Aug 02 13:12:50 CDT 2006); if that does not work, then attempts to use the
* DateFormat for the current locale instead.
*
* @see ecologylab.serialization.types.ScalarType#getInstance(java.lang.String, String[],
* ScalarUnmarshallingContext)
*/
@Override
public Date getInstance(String value, String[] formatStrings,
ScalarUnmarshallingContext scalarUnmarshallingContext)
{
for (DateFormat dateFormatParser: dateFormats)
{
try
{
return dateFormatParser.parse(value);
} catch (java.text.ParseException ex)
{
// simply try the next pattern
}
if (formatStrings != null)
for (String thatFormat: formatStrings)
{
try
{
return new SimpleDateFormat(thatFormat).parse(value);
} catch (java.text.ParseException ex)
{
// simply try the next pattern
}
}
}
error("Failed to parse date: " + value);
return null;
}
}