Question

I'm looking to add 1 second to a datetime so I can test date based pagination. I'm hoping get a date from our API response, convert the date string into a date, then convert that into milliseconds, add a second and then convert back into a datestring and use it in my next API request. ( sound longwinded? It sure feels like it is!)

I'm having and issue when I try to parse a dateTime. The following code is throwing an error:

def c= new date().parse("yyyy-mm-ddThh:mm:ss",lastDate)
log.info "new formatt"+lastDate
log.info c.timeInMillis

Error: groovy.lang.MissingMethodException: No signature of method: java.util.Date.parse() is applicable for argument types: (java.lang.String, groovy.util.slurpersupport.NodeChildren) values: [yyyy-mm-ddThh:mm:ss, 2007-01-26T00:00:00] Possible solutions: parse(java.lang.String), parse(java.lang.String, java.lang.String), wait(), clone(), any(), use(java.util.List, groovy.lang.Closure)

Any tips on how to achieve my goal? Or is it a dimwit approach?

Was it helpful?

Solution

Probably the most consise, idiomatic groovy solution without dependencies:

Date.parse( "yyyy-MM-dd'T'HH:mm:ss", text ).with { new Date( time + 1000) }

OTHER TIPS

Sounds like quite a round about way of adding a second. Why not just:

import groovy.time.TimeCategory

def lastDate = new Date()

use(TimeCategory) {
    lastDate = lastDate + 1.second
}

For more flexible date string parsing, you might want to look at the JChronic java library. It can handle dates in many different formats and doesn't rely on having an exact template like the SimpleDateFormat class. Here's an example using both of these:

Date.metaClass.'static'.fromString = { str ->
    com.mdimension.jchronic.Chronic.parse(str).beginCalendar.time
}

def lastDate = Date.fromString("2007-01-26T00:00:00")

use (TimeCategory) {
    100.times {
        runTest(lastDate)
        lastDate = lastDate + 1.second
    }
}

A more generic Java solution is to use the Joda Time library.

//
// Dependencies
// ============
import org.joda.time.*
import org.joda.time.format.*

@Grapes([
    @Grab(group='joda-time', module='joda-time', version='1.6.2')
])

//
// Main program
// ============    
DateTimeFormatter psr = ISODateTimeFormat.dateTimeParser()
DateTimeFormatter fmt = ISODateTimeFormat.dateHourMinuteSecond()

DateTime inDate = psr.parseDateTime("2010-11-18T23:23:59")

println fmt.print(inDate.plusSeconds(1))

It can handle any incoming and outgoing date formatting, including complex scenarios with timezones in the Date string, eg "2010-11-18T23:23:59+01:00"

A colleague helped with the following -

--import groovy.time.TimeCategory)

def aDate = lastDate.toString()
def newdate = Date.parse("yyyy-MM-dd'T'HH:mm:ss",aDate)
use(TimeCategory){
 newdate = newdate+1.second
}

I had a bit of difficulty initially adding the time - the types weren't playing nicely together.

Thanks all for your responses folks!

Take a look here:

You want to use something like:

def c = Calendar.instance
c.add(Calendar.SECOND, 1)

You need to initialize c with a date you want, look at the link on different possibilities, but here's an example:

c = new GregorianCalendar(2009, Calendar.JULY, 22, 2, 35, 21)
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top