你好,我正在计算Groovy中两个时间之间的差异(持续时间)。
start = "2010-10-07T22:15:33.110+01:00" stop = "2010-10-07T22:19:52.356+01:00"
理想情况下,我希望以小时、分钟、秒、毫秒为单位返回持续时间。有人能帮忙吗?我试过使用Groovy的持续时间类,但是没有任何进展。感谢您的协助。
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
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*/ }
wtzytmuj3#
我也有同样的问题,我使用了Demian在他的answer中所建议的内容,只是我需要它是通用的,并且可以处理start或stop的任何值,因此我分享了Demian的答案的改进,以供将来参考。它只使用OP变量,并使用正则表达式进行一般替换,以便保留时区偏移量的值
start
stop
请注意,groovy.time.TimeDuration是不可序列化的,因此会与jenkins的CPS-groovy混淆并抛出java.io.NotSerializableException。
groovy.time.TimeDuration
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
sdnqo3pr4#
使用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
4条答案
按热度按时间f3temu5u1#
如果你只是想找出你自己创建的两个时间之间的差异(例如,看看执行某个东西需要多长时间),你可以用途:
如果你特别需要处理上面字符串中的日期,试试这个,首先它们的格式有点奇怪,特别是+01:00,这是时区,我希望它是+0100格式才能正常工作。你可以删除我刚刚替换的时区。
产出
ycl3bljg2#
我也会这么做
然后
wtzytmuj3#
我也有同样的问题,我使用了Demian在他的answer中所建议的内容,只是我需要它是通用的,并且可以处理
start
或stop
的任何值,因此我分享了Demian的答案的改进,以供将来参考。它只使用OP变量,并使用正则表达式进行一般替换,以便保留时区偏移量的值
请注意,
groovy.time.TimeDuration
是不可序列化的,因此会与jenkins的CPS-groovy混淆并抛出java.io.NotSerializableException
。sdnqo3pr4#
使用java.time.* 包
更多信息:https://docs.oracle.com/javase/tutorial/datetime/iso/period.html