web-dev-qa-db-ja.com

Groovyの期間

こんにちは、私はGroovyで2つの時間の差(期間)を計算しようとしています。例えば.

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

理想的には、時間、分、秒、ミリ秒で返される期間を取得したいです。

誰か助けてください。 Groovyの期間クラスを使用しようとしましたが、何も進歩することができませんでした。

ご協力ありがとうございます。

34
Carl Bourne

自分で作成した2回の違いを見つけたいだけの場合(たとえば、実行にかかる時間を確認するため)、次のように使用できます。

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

上記の文字列として指定された日付を使用して作業する必要がある場合。これを試してみてください。最初に、それらのフォーマットが少し奇妙です。特に、タイムゾーンである+01:00です。フォーマットが機能するためには、+ 0100であると期待します。置き換えたばかりのタイムゾーンを削除できます。

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

アウトプット

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

私はそのようなことをします

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

当時

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

同じ質問があり、 Demian で提案されたもの answer を使用しましたが、それが一般的で、startの値を処理するために必要でしたまたはstopなので、今後の参考のために、このデミアンの答えの改善を共有します。

正規表現を使用して一般的な置換を行い、OP変数を使用するだけで、タイムゾーンオフセットの値を維持します。

groovy.time.TimeDurationはシリアライズ可能ではないので、 jenkinsのCPS-groovyを台無しにして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