Uploaded image for project: 'Groovy'
  1. Groovy
  2. GROOVY-7964

TimeCategory incorrectly counts days difference between two dates

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Open
    • Minor
    • Resolution: Unresolved
    • 2.4.7
    • None
    • groovy-runtime
    • Windows 10 x86_64, Oracle Java 1.8.0.102 x86_64

    Description

      TimeCategory incorrectly counts days difference between two dates.
      Exhibit (Groovy code):

      #!/usr/bin/env groovy
      
      @Grab(group='joda-time', module='joda-time', version='2.9.4+')
      
      import java.io.BufferedReader
      import java.io.IOException
      import java.io.InputStreamReader
      import java.time.LocalDate
      import java.time.format.DateTimeFormatter
      import java.time.temporal.ChronoUnit
      
      import groovy.time.TimeCategory
      
      String date1 = '2016-03-22'
      String date2 = '2016-03-29'
      String fmt = 'yyyy-MM-dd'
      
      
      // Java 8 ChronoUnit:
      
      DateTimeFormatter formatter = DateTimeFormatter.ofPattern(fmt)
      
      //LocalDate firstDate = LocalDate.parse(date1, formatter)
      //LocalDate secondDate = LocalDate.parse(date2, formatter)
      long days = ChronoUnit.DAYS.between(
      	LocalDate.parse(date1, formatter), 
      	LocalDate.parse(date2, formatter)
      )
      
      println "Java 8 ChronoUnit: Dates between $date1 and $date2 : $days"
      
      // Groovy TimeCategory/Date:
      use (TimeCategory) {
      	def d = (Date.parse(fmt, date2) - Date.parse(fmt, date1)).days
      	println "Groovy TimeCategory/Date: Dates between $date1 and $date2 : $d"
      }
      
      
      // Joda Time:
      // LocalDate fromDateFields(Date date)
      // Date.parse('yyyy-MM-dd', dlf.@dldpf.toString())
      
      days = org.joda.time.Days.daysBetween(
      	org.joda.time.LocalDate.fromDateFields(Date.parse(fmt,date1)), 
      	org.joda.time.LocalDate.fromDateFields(Date.parse(fmt,date2))
      ).getDays()
      println "Joda Time: Dates between $date1 and $date2 : $days"
      

      Current Output:

      $ groovy DatesDiff.groovy
      Java 8 ChronoUnit: Dates between 2016-03-22 and 2016-03-29 : 7
      Groovy TimeCategory/Date: Dates between 2016-03-22 and 2016-03-29 : 6
      Joda Time: Dates between 2016-03-22 and 2016-03-29 : 7
      

      Expected Output:

      $ groovy DatesDiff.groovy
      Java 8 ChronoUnit: Dates between 2016-03-22 and 2016-03-29 : 7
      Groovy TimeCategory/Date: Dates between 2016-03-22 and 2016-03-29 : 7
      Joda Time: Dates between 2016-03-22 and 2016-03-29 : 7
      

      Resume: notice the difference in "Groovy TimeCategory/Date" line.

      Attachments

        1. DatesDiff.groovy
          1 kB
          Los Pejos

        Activity

          People

            Unassigned Unassigned
            lospejos Los Pejos
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

            Dates

              Created:
              Updated: