web-dev-qa-db-fra.com

Durées de temps Groovy

Salut, j'essaie de calculer la différence (durée) entre deux fois dans Groovy. par exemple.

start =  "2010-10-07T22:15:33.110+01:00"
stop =   "2010-10-07T22:19:52.356+01:00"

Idéalement, je voudrais que la durée soit renvoyée en heures, minutes, secondes, millisecondes.

Quelqu'un peut-il s'il vous plaît aider. J'ai essayé d'utiliser les classes de durée de Groovy mais je n'ai pas pu progresser.

Merci pour votre aide.

34
Carl Bourne

Si vous voulez juste trouver la différence entre deux fois que vous vous créez (par exemple pour voir combien de temps quelque chose prend à exécuter), vous pouvez utiliser:

import groovy.time.*

def timeStart = new Date()
// Some code you want to time
def timeStop = new Date()
TimeDuration duration = TimeCategory.minus(timeStop, timeStart)
println duration

Si vous avez spécifiquement besoin de travailler avec les dates fournies dans la chaîne ci-dessus. Essayez ceci, d'abord leur format est un peu étrange, en particulier le +01: 00, qui est le fuseau horaire, je m'attendrais à ce qu'il soit +0100 pour que le format fonctionne. Vous pouvez simplement supprimer le fuseau horaire que je viens de remplacer.

import groovy.time.*

def start = Date.parse("yyy-MM-dd'T'HH:mm:ss.SSSZ","2010-10-07T22:15:33.110+01:00".replace("+01:00","+0100"))
println start
def end = Date.parse("yyy-MM-dd'T'HH:mm:ss.SSSZ","2010-10-07T22:19:52.356+01:00".replace("+01:00","+0100"))
println end
TimeDuration duration = TimeCategory.minus(end, start)
println duration

Les sorties

Thu Oct 07 15:15:33 MDT 2010
Thu Oct 07 15:19:52 MDT 2010
4 minutes, 19.246 seconds
60
Demian

Je ferais quelque chose comme ça

def elapsedTime(Closure closure){
    def timeStart = new Date()
    closure()
    def timeStop = new Date()
    TimeCategory.minus(timeStop, timeStart)
}

un alors

TimeDuration timeDuration = elapsedTime { /*code you want to time*/ }
22
DanieleDM

J'avais la même question et j'ai utilisé ce que Demian a suggéré dans son réponse , sauf que j'avais besoin qu'elle soit générique et fonctionne avec toutes les valeurs de start ou stop, donc je partage cette amélioration de la réponse de Demian pour référence future.

Il utilise simplement les variables OP, avec un remplacement générique utilisant une expression régulière, afin de conserver la valeur du décalage de fuseau horaire

Notez que groovy.time.TimeDuration n'est pas sérialisable , et donc gâchera avec le groove CPS des jenkins et lancera Java.io.NotSerializableException.

import groovy.time.*

def start =  "2010-10-07T22:15:33.110+01:00"
def stop =   "2010-10-07T22:19:52.356+01:00"
def format = "yyy-MM-dd'T'HH:mm:ss.SSSZ"
start = Date.parse(format , start.replaceAll(/([+\-])(\d\d):(\d\d)/, /$1$2$3/))
println start
stop = Date.parse(format , stop.replaceAll(/([+\-])(\d\d):(\d\d)/, /$1$2$3/))
println stop
TimeDuration duration = TimeCategory.minus(stop, start)
println duration
0
Clem