Richard Fortune
Richard Fortune

Reputation: 305

Date time in Groovy

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?

Upvotes: 9

Views: 25561

Answers (5)

btiernay
btiernay

Reputation: 8129

Probably the most consise, idiomatic groovy solution without dependencies:

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

Upvotes: 12

Richard Fortune
Richard Fortune

Reputation: 305

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!

Upvotes: 1

Mark O'Connor
Mark O'Connor

Reputation: 77961

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"

Upvotes: 2

ataylor
ataylor

Reputation: 66059

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
    }
}

Upvotes: 15

icyrock.com
icyrock.com

Reputation: 28598

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)

Upvotes: 0

Related Questions