2010-11-17 6 views
8

Je cherche à ajouter 1 seconde à un datetime afin que je puisse tester la pagination basée sur la date. J'espère obtenir une date à partir de notre réponse API, convertir la chaîne de date en une date, puis la convertir en millisecondes, ajouter une seconde, puis convertir en une chaîne de dates et l'utiliser dans ma prochaine demande d'API. (ça sonne longwinded? Il se sent vraiment comme il est!)Date heure dans Groovy

Je rencontre et je m'inquiète quand j'essaye d'analyser un dateTime. Le code suivant est de lancer une erreur:

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

Erreur: groovy.lang.MissingMethodException: Pas de signature de la méthode: java.util.Date.parse() est applicable pour les types d'arguments: (java.lang.String , groovy.util.slurpersupport.NodeChildren) valeurs: [aaaa-mm-jjThh: mm: ss, 2007-01-26T00: 00: 00] Solutions possibles: analyser (java.lang.String), analyser (java.lang. String, java.lang.String), wait(), clone(), any(), utilisez (java.util.List, groovy.lang.Closure)

Des conseils sur la façon d'atteindre mon objectif? Ou est-ce une approche de dimwit?

Répondre

9

Probablement le plus concise, solution groovy idiomatiques sans dépendances:

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

Whoa, belle et succincte. Je vais essayer et voir si ça va. Merci! –

0

Jetez un coup d'oeil ici:

Vous voulez utiliser quelque chose comme:

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

Vous devez initialiser c avec une date que vous voulez, regardez la lien sur différentes possibilités, mais voici un exemple:

c = new GregorianCalendar(2009, Calendar.JULY, 22, 2, 35, 21) 
14

Cela ressemble beaucoup à une façon d'ajouter une seconde. Pourquoi ne pas simplement:

import groovy.time.TimeCategory 

def lastDate = new Date() 

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

Pour l'analyse de chaîne de date plus souple, vous voudrez peut-être regarder la bibliothèque java JChronic. Il peut gérer des dates dans de nombreux formats différents et ne compte pas sur un modèle exact comme la classe SimpleDateFormat. Voici un exemple en utilisant ces deux:

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

Une solution Java plus générique est d'utiliser la bibliothèque Joda Time.

// 
// 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)) 

Il peut gérer la mise en forme de la date d'entrée et de sortie, y compris des scénarios complexes avec fuseaux horaires dans la chaîne de date, par exemple "2010-11-18T23: 23: 59 + 01: 00"

1

Un collègue a aidé avec le suivant -

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

J'ai eu un peu de difficulté en ajoutant initialement l'heure - les types ne jouaient pas bien ensemble.

Merci à tous pour vos réponses les gens!