你好,我正在尝试在Groovy中计算两个时间之间的差异(持续时间)。例如:
start = "2010-10-07T22:15:33.110+01:00"
stop = "2010-10-07T22:19:52.356+01:00"
理想情况下,我希望以小时、分钟、秒和毫秒的形式返回持续时间。请问有人可以帮忙吗? 我尝试使用Groovy的duration类,但一直没有取得任何进展。 谢谢你的帮助。如果你只想找出自己创建的两个时间之间的差异(例如查看某些操作的执行时间),你可以使用以下方法:
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
我会做类似那样的事情
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*/ }
使用java.time.*包
建议使用groovy linters,其消息为“不要使用java.util.Date。优先使用java.time中的类。包”*
import java.time.Instant
import java.time.temporal.ChronoUnit
long elapsedTime(Closure closure) {
Instant timeStart = Instant.now()
closure()
Instant timeStop = Instant.now()
return ChronoUnit.MILLIS.between(timeStart, timeStop)
}
println elapsedInMillis = elapsedTime {
// code you want to time, e.g.:
sleep 456
}
我有同样的问题,我使用了Demian在他的answer中建议的方法,只是我需要它是通用的,并且可以与任何start
或stop
的值一起使用,因此我分享了这个改进版的Demian答案以供将来参考。
它只是使用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
import groovy.time.*
//Define sysdate
TimeZone.setDefault(TimeZone.getTimeZone('EET'))
today = new Date()
def startDate = today.format("YYYY-MM-dd HH:mm:ss")
log.info(" Test execution start time: $startDate")
//Set start time itno test suite property
testRunner.testCase.testSuite.setPropertyValue("execStartTime",startDate.toString())
import groovy.time.*
//Define sysdate
TimeZone.setDefault(TimeZone.getTimeZone('EET'))
today = new Date()
def endDate = today.format("YYYY-MM-dd HH:mm:ss")
def end = Date.parse("YYYY-MM-dd HH:mm:ss",endDate)
log.info(" Test execution end time: $endDate")
//Set start end itno test suite property
testRunner.testCase.testSuite.setPropertyValue("execEndTime",end.toString())
//Calculate duration
def start = testRunner.testCase.testSuite.getPropertyValue("execStartTime")
def startDate = Date.parse("YYYY-MM-dd HH:mm:ss",start)
TimeDuration duration = TimeCategory.minus(end, startDate)
//Get out from 000
def durationText = duration.toString().replace(".000 seconds"," seconds")
log.info(" Test execution duration: $durationText")
//Set duration itno test suite property
testRunner.testCase.testSuite.setPropertyValue("execDuration",durationText.toString())