Try parseDate, rather than parseDateStrictly?

https://commons.apache.org/proper/commons-lang/javadocs/api-3.1/org/apache/commons/lang3/time/DateUtils.html#parseDate(java.lang.String,%20java.lang.String...)

Trouble is, you are deliberately trying to make an invalid date, I think...

________________________________
From: James McMahon <jsmcmah...@gmail.com>
Sent: Tuesday, 20 June 2023 10:58 AM
To: users@groovy.apache.org <users@groovy.apache.org>
Subject: Re: Working with Calendar object in Groovy

If I want to set the month and day in the date|calendar object to 00 when I 
only have a year, it seems that DateUtil forces those to be 01 even when all it 
gets is a year such as 1999. I can't allow it to default to 19990101 in such 
cases - there will be legit occurrences of 19990101. I want to force it to be 
19990000. The Calendar object comes close, because it sets cal.MONTH to 0, but 
it does that if the month is 01 legitimately, or if it is missing. That seems 
unfortunate.

This is my code so far:

  // https://docs.oracle.com/javase/8/docs/api/java/text/SimpleDateFormat.html
final String[] PATTERNS = new String[] {
        "MMMM dd, yyyy",
        "yyyy",
        "// // MMMM dd, yyyy",  // I am not sure this one is a legit pattern, 
and may drop this
        "MM/dd/yyyy",
        "yyyy-MM-dd", "yyyy-mm"
}

     // https://stackoverflow.com/a/54952272, reference credit: Bob Brown
    datesToNormalize.split(/(?ms)::-::/, -1).collect { it.trim() }.each { 
candidate ->
       try {
           parsed = DateUtils.parseDateStrictly(candidate, PATTERNS)
           def Calendar cal = Calendar.getInstance()
           cal.setTime(parsed)

           log.info<http://log.info>("Given: ${candidate}; parsed: ${cal} 
month: ${cal.get(Calendar.MONTH)}")
       } catch (Exception e) {
           log.error("Could not parse: ${candidate}")
       }
    }

What I find when I look closely at the details of the calendar object for a 
year only, such as 1991..

2023-06-19 17:21:26,235 INFO [Timer-Driven Process Thread-8] 
o.a.nifi.processors.script.ExecuteScript 
ExecuteScript[id=33a5179c-1df4-128b-52be-aaa96b947012] Given: 1991; parsed: 
java.util.GregorianCalendar[time=662688000000,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="UTC",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=1991,MONTH=0,WEEK_OF_YEAR=1,WEEK_OF_MONTH=1,DAY_OF_MONTH=1,DAY_OF_YEAR=1,DAY_OF_WEEK=3,DAY_OF_WEEK_IN_MONTH=1,AM_PM=0,HOUR=0,HOUR_OF_DAY=0,MINUTE=0,SECOND=0,MILLISECOND=0,ZONE_OFFSET=0,DST_OFFSET=0]
 month: 0

Why it sets DAY_OF_MONTH to 1 when we only present a YYYY is unfortunate too.

I wish to get my final normalized output to be 19910000 in such cases.

On Mon, Jun 19, 2023 at 8:03 PM Bob Brown 
<b...@transentia.com.au<mailto:b...@transentia.com.au>> wrote:
I guess the key thing to bear in mind is:

https://docs.oracle.com/en/java/javase/20/docs/api/java.base/java/util/Calendar.html
"""
The calendar field values can be set by calling the set methods. Any field 
values set in a Calendar will not be interpreted until it needs to calculate 
its time value (milliseconds from the Epoch) or values of the calendar fields. 
Calling the get, getTimeInMillis, getTime, add and roll involves such 
calculation.
"""

Calendar doesn't provide a way to differentiate, in other words.

See default values for fields at 
https://docs.oracle.com/en/java/javase/20/docs/api/java.base/java/util/GregorianCalendar.html

Calendar is often used as a ' bucket' for timey-wimey things: you stuff things 
into fields that contextually make sense and ignore those that don't. Not very 
nice OO or helpful as an API.

It MAY be (speaking off the top of my head here) that you don't need/want 
Calendar...the newer java.time package has many "finer-grained" classes for 
things like Instance, Period, Duration, etc. that might be a better fit for a 
specific use-case: https://www.baeldung.com/java-8-date-time-intro

BOB
________________________________
From: James McMahon <jsmcmah...@gmail.com<mailto:jsmcmah...@gmail.com>>
Sent: Tuesday, 20 June 2023 8:53 AM
To: users@groovy.apache.org<mailto:users@groovy.apache.org> 
<users@groovy.apache.org<mailto:users@groovy.apache.org>>
Subject: Working with Calendar object in Groovy

If I have a Calendar object created for 1999-01-01, a get() of calendar.MONTH 
will return 0. From references I’ve found through Google, we have to add 1 to 
MONTH to get the 1 for January. The calendar object has 0 for MONTH.

Now let’s take the case where we set our calendar object from “1999”,. When we 
get MONTH it is also 0 - but not because our month was January, but because it 
was not present.

How does the calendar instance differentiate between those two cases? Is there 
another calendar object element that tells me “hey, I could set no day or month 
from a date like 1999”?

Reply via email to