Groovy持续时间

0yycz8jy  于 2022-11-01  发布在  其他
关注(0)|答案(4)|浏览(289)

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

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

理想情况下,我希望以小时、分钟、秒、毫秒为单位返回持续时间。
有人能帮忙吗?我试过使用Groovy的持续时间类,但是没有任何进展。
感谢您的协助。

f3temu5u

f3temu5u1#

如果你只是想找出你自己创建的两个时间之间的差异(例如,看看执行某个东西需要多长时间),你可以用途:

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
ycl3bljg

ycl3bljg2#

我也会这么做

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

wtzytmuj3#

我也有同样的问题,我使用了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
sdnqo3pr

sdnqo3pr4#

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

相关问题