Groovy时间持续期间

42

你好,我正在尝试在Groovy中计算两个时间之间的差异(持续时间)。例如:

start =  "2010-10-07T22:15:33.110+01:00"
stop =   "2010-10-07T22:19:52.356+01:00"
理想情况下,我希望以小时、分钟、秒和毫秒的形式返回持续时间。请问有人可以帮忙吗? 我尝试使用Groovy的duration类,但一直没有取得任何进展。 谢谢你的帮助。

你得到的时间格式是什么,还是你将其转换为这种格式了? - Aaron Saunders
5个回答

75

如果你只想找出自己创建的两个时间之间的差异(例如查看某些操作的执行时间),你可以使用以下方法:

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

1
只是一个提醒,TimeCategory 不是线程安全的。我通过艰难的方式发现了这一点。 - wiredniko

25

我会做类似那样的事情

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

1

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

更多信息: https://docs.oracle.com/javase/tutorial/datetime/iso/period.html

0

我有同样的问题,我使用了Demian在他的answer中建议的方法,只是我需要它是通用的,并且可以与任何startstop的值一起使用,因此我分享了这个改进版的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

0
有时候你需要获取不同“动作”的持续时间,它们不在一个流程中,所以你不能保存变量,而需要将其存储在某个属性中(甚至是临时文件): 获取并存储开始时间 - SoapUI Groovy 示例:
    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())

获取和存储结束时间,并计算持续时间 - SoapUI Groovy示例:
    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())

输入图像描述


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接