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

Wolfgang Laun wolfgang.laun at gmail.com
Fri Feb 1 09:46:22 EST 2013


Just let me say that my hack permits me to use

  "1-Feb-2013"
  "1-Feb-2013 15:50"
  "2013-02-01"
  "2013-02-01 3:50pm"

in the same DRL, without any decorations.

(Why should I, user, bear the burden of telling the computer that
"01-feb-2013" is in the format DD-MON-YYYY? The darned thing
should be able to see that - any 8 year old can.)

-W


On 01/02/2013, Mark Proctor <mproctor at codehaus.org> wrote:
> 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
>
>
> _______________________________________________
> 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