[rules-dev] [rules-users] Is it posibble to keep two date formats in drools like 'dd-MMM-yyyy' and 'dd-MMM-yyyy HH:mm'

Mark Proctor mproctor at codehaus.org
Fri Feb 1 09:02:48 EST 2013


I started to look at the integration points necessary for different date formats. The backend implementation is not really the problem, but how to do it at a language level is - so while the backend exists, the front end does not.

We are looking at extending the inline casting for unit support, which would then introduce different date formats. So it would look something like below.
"01-feb-2013"#DD-MON-YYYY

We will probably allow aliasing
"01-feb-2013"#df1

But I don't think this will be done soon.

Mark

On 1 Feb 2013, at 13:39, Wolfgang Laun <wolfgang.laun at gmail.com> wrote:

> OP's problem statement is indeed valid. Given the wide range of
> possible date formats, a generic solution that tolerates the omission
> of times so that a single format might be used for both, date+time and
> date alone, isn't feasible.
> 
> org.drools.core.util.DateUtils contains traces of an idea to have
> multiple formats, but this doesn't seem to be supported (or is
> absolutely undocumented).
> 
> I guess my hack (see code below) is an improvement over the current state.
> 
> -W
> 
> 
> ---------- Forwarded message ----------
> From: Wolfgang Laun <wolfgang.laun at gmail.com>
> Date: Thu, 31 Jan 2013 10:33:18 +0100
> Subject: Re: [rules-users] Is it posibble to keep two date formats in
> drools like 'dd-MMM-yyyy' and 'dd-MMM-yyyy HH:mm'
> To: Rules Users List <rules-users at lists.jboss.org>
> 
> Not without a hack: replace  org.drools.core.util.DateUtils by the
> modified code given below. Specify drools.dateformat as a list of date
> formats separated by a newline, e.g.:
> 
> System.setProperty( "drools.dateformat", "dd-MMM-yyyy HH:mm\ndd-MMM-yyyy" );
> 
> Make sure that a more comprehensive format is first, they are tried in
> the given order, and a longer String is accepted for a shorter format.
> The very first format is used for printing (whenever Drools feels like
> doing so). On error, you may see a message such as
> 
> Invalid date input format: [1-5-1985] it should follow one of:
> [dd-MMM-yyyy HH:mm] or [dd-MMM-yyyy]
> 
> And the default format is dd-MMM-yyyy - NOT dd-mmm-yyyy as "Expert"
> would have it.
> 
> -W
> 
> package org.drools.core.util;
> 
> import java.text.DateFormat;
> import java.text.DateFormatSymbols;
> import java.text.ParseException;
> import java.text.SimpleDateFormat;
> import java.util.Date;
> import java.util.Locale;
> 
> import org.drools.type.DateFormats;
> 
> public class DateUtils {
> 
>    private static final long serialVersionUID = 510l;
>    private static final String DEFAULT_FORMAT_MASK = "dd-MMM-yyyy";
>    private static final String DATE_FORMAT_MASK = getDateFormatMask();
>    private static final String DEFAULT_COUNTRY = Locale.getDefault()
>            .getCountry();
>    private static final String DEFINE_COUNTRY = getDefaultContry();
>    private static final String DEFAULT_LANGUAGE = Locale.getDefault()
>            .getLanguage();
>    private static final String DEFINE_LANGUAGE = getDefaultLanguage();
> 
>    private static ThreadLocal<SimpleDateFormat[]> df = new
> ThreadLocal<SimpleDateFormat[]>() {
>        protected SimpleDateFormat[] initialValue() {
>            DateFormatSymbols dateSymbol = new DateFormatSymbols(new Locale(
>                    DEFINE_LANGUAGE, DEFINE_COUNTRY));
>            String[] masks = getDateFormatMask().split( "\\n" );
>            SimpleDateFormat[] dateFormats = new SimpleDateFormat[masks.length];
>            for( int i = 0; i < masks.length; i++ ){
> 		dateFormats[i] = new SimpleDateFormat(masks[i], dateSymbol);
> 	    }
>            return dateFormats;
>        };
>    };
> 
>    private static String getDefaultLanguage() {
>        String fmt = System.getProperty("drools.defaultlanguage");
>        if (fmt == null) {
>            fmt = DEFAULT_LANGUAGE;
>        }
>        return fmt;
>    }
> 
>    private static String getDefaultContry() {
>        String fmt = System.getProperty("drools.defaultcountry");
>        if (fmt == null) {
>            fmt = DEFAULT_COUNTRY;
>        }
>        return fmt;
>    }
> 
>    /** Use the simple date formatter to read the date from a string */
>    public static Date parseDate(final String input, DateFormats dateFormats) {
>        for( SimpleDateFormat dateFormat: df.get() ){
> 	    try {
>                Date date = dateFormat.parse( input );
>                return date;
> 	    } catch (final ParseException e) {
> 	    }
> 	}
>        String valids = DATE_FORMAT_MASK.replace( "\n", "] or [" );
> 	throw new IllegalArgumentException("Invalid date input format: ["
>                    + input + "] it should follow one of: [" + valids + "]");
>    }
> 
>    /** Use the simple date formatter to convert the Date into a String */
>    public static String format(final Date input) {
>        return df.get()[0].format( input );
>    }
> 
>    /** Converts the right hand side date as appropriate */
>    public static Date getRightDate(final Object object2, DateFormats
> dateFormats) {
>        if (object2 == null) {
>            return null;
>        }
>        if (object2 instanceof String) {
>            return parseDate((String) object2, dateFormats);
>        } else if (object2 instanceof Date) {
>            return (Date) object2;
>        } else {
>            throw new IllegalArgumentException("Unable to convert "
>                    + object2.getClass() + " to a Date.");
>        }
>    }
> 
>    /** Check for the system property override, if it exists */
>    public static String getDateFormatMask() {
>        String fmt = System.getProperty("drools.dateformat");
>        if (fmt == null) {
>            fmt = DEFAULT_FORMAT_MASK;
>        }
>        return fmt;
>    }
> }
> 
> 
> On 31/01/2013, richie <haoruiqian at gmail.com> wrote:
>> Hi,
>> 
>> The default date format in drools is 'dd-MMM-yyyy', but in the definition
>> of
>> rule attribute date-effective, it says it contain a date and time
>> definition, so if I set date-effective to "30-Jan-2013 08:00", then the
>> time
>> set in date-effective will be ignored, so I changed the date format to
>> 'dd-MMM-yyyy HH:mm', now the effective date works correctly, but then we
>> got
>> problem here, if user input a date like "30-Jan-2013" the drools will
>> failed
>> to execute, so must force user to input a date like this "30-Jan-2013
>> 00:00", this is not user friendly and the string "00:00" is meaningless.
>> 
>> What I want to know is, if it's possible to keep this two formats both?
>> 
>> Thanks.
>> 
>> 
>> 
>> --
>> View this message in context:
>> http://drools.46999.n3.nabble.com/Is-it-posibble-to-keep-two-date-formats-in-drools-like-dd-MMM-yyyy-and-dd-MMM-yyyy-HH-mm-tp4021981.html
>> Sent from the Drools: User forum mailing list archive at Nabble.com.
>> _______________________________________________
>> rules-users mailing list
>> rules-users at lists.jboss.org
>> https://lists.jboss.org/mailman/listinfo/rules-users
>> 
> _______________________________________________
> rules-dev mailing list
> rules-dev at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-dev




More information about the rules-dev mailing list