嗨,我正在尝试计算 Groovy 中两次之间的差异(持续时间)。例如
start = "2010-10-07T22:15:33.110+01:00"
stop = "2010-10-07T22:19:52.356+01:00"
理想情况下,我希望以小时、分钟、秒、毫秒为单位返回持续时间。
任何人都可以帮忙。我尝试使用 Groovy 的持续时间类,但没有取得任何进展。
感谢你的协助。
如果您只想找出您自己创建的两次之间的差异(例如查看执行某项需要多长时间),您可以使用:
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*/ }
我有同样的问题,我使用了Demian在他的回答中建议的内容,除了我需要它是通用的并且可以使用start
or的任何值stop
,因此我分享了 Demian 回答的改进以供将来参考。
它只使用 OP 变量,并使用正则表达式进行通用替换,以保持时区偏移的值
请注意,groovy.time.TimeDuration
它不是可序列化的,因此会与詹金斯的 CPS-groovy 和 throw 混淆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