Brian Koehmstedt created GROOVY-8368:
----------------------------------------

             Summary: date arithmetic bug using TimeCategory intervals
                 Key: GROOVY-8368
                 URL: https://issues.apache.org/jira/browse/GROOVY-8368
             Project: Groovy
          Issue Type: Bug
    Affects Versions: 2.6.0-alpha-1
         Environment: $ uname -a
Linux i7 4.4.0-97-generic #120-Ubuntu SMP Tue Sep 19 17:28:18 UTC 2017 x86_64 
x86_64 x86_64 GNU/Linux

$ groovy -v
Groovy Version: 2.6.0-alpha-1 JVM: 1.8.0_131 Vendor: Oracle Corporation OS: 
Linux

$ java -version
openjdk version "1.8.0_131"
OpenJDK Runtime Environment (build 1.8.0_131-8u131-b11-2ubuntu1.16.04.3-b11)
OpenJDK 64-Bit Server VM (build 25.131-b11, mixed mode)

            Reporter: Brian Koehmstedt
            Priority: Minor
         Attachments: intervalBug.groovy

There's a clear date arithmetic bug using TimeCategory intervals and it appears 
to show itself only the 30th of any given month.  I noticed this because our 
automatic builds fail towards the end of the month and this has been going on 
for a long time.  I decided to hunt this down today (Oct 30) as the build 
failed today and I had time to track it down.  I was able to produce a small 
script to reproduce it, as shown below.  I tested with latest 2.6.0 alpha1 as 
well as 2.4.10 (what we're actually using).  Both show the bug.

I don't have an opinion on how "1.month" is interpreted in Groovy.  That's not 
what this submission is about.  The bug I am reporting here is that the 
following two expressions should always evaluate to the same value and it 
appears they don't on the 30th of the month:
{code}
// fails on the 30th of the month (at least, for Oct 30 2017)
assert now + 1.month + 1.day == now + 1.day + 1.month
{code}

{code}
// START of intervalBug.groovy
import groovy.time.TimeCategory

Date now = new Date().clearTime()
println "current date = $now"
use(TimeCategory) {
  println "now+1day+1month = ${now + 1.day + 1.month}"
  println "now+1month+1day = ${now + 1.month + 1.day}"
}
// END of intervalBug.groovy
{code}

{noformat}
# also tested with groovy-2.4.10 with same buggy result
$ groovy -v
Groovy Version: 2.6.0-alpha-1 JVM: 1.8.0_131 Vendor: Oracle Corporation OS: 
Linux

# 29th of month is OK: same result produced
$ sudo date -s "29 OCT 2017 13:00:00"; groovy intervalBug.groovy
Sun Oct 29 13:00:00 PDT 2017
current date = Sun Oct 29 00:00:00 PDT 2017
now+1day+1month = Thu Nov 30 00:00:00 PST 2017
now+1month+1day = Thu Nov 30 00:00:00 PST 2017

# 30th of month is BUGGY: different result produced
$ sudo date -s "30 OCT 2017 13:00:00"; groovy intervalBug.groovy
Mon Oct 30 13:00:00 PDT 2017
current date = Mon Oct 30 00:00:00 PDT 2017
now+1day+1month = Thu Nov 30 00:00:00 PST 2017
now+1month+1day = Fri Dec 01 00:00:00 PST 2017

# 31st of month is OK
$ sudo date -s "31 OCT 2017 13:00:00"; groovy intervalBug.groovy
[sudo] password for bkoehmstedt: 
Tue Oct 31 13:00:00 PDT 2017
current date = Tue Oct 31 00:00:00 PDT 2017
now+1day+1month = Fri Dec 01 00:00:00 PST 2017
now+1month+1day = Fri Dec 01 00:00:00 PST 2017

# 1st of month is OK
$ sudo date -s "01 NOV 2017 13:00:00"; groovy intervalBug.groovy
[sudo] password for bkoehmstedt: 
Wed Nov  1 13:00:00 PDT 2017
current date = Wed Nov 01 00:00:00 PDT 2017
now+1day+1month = Sat Dec 02 00:00:00 PST 2017
now+1month+1day = Sat Dec 02 00:00:00 PST 2017
{noformat}




--
This message was sent by Atlassian JIRA
(v6.4.14#64029)

Reply via email to