Groovy TimeCategory添加了不到毫秒的时间

时间:2012-10-11 06:58:23

标签: groovy milliseconds

尝试此示例代码时:

use(groovy.time.TimeCategory) {
    800.millisecond + 300.millisecond
}

在groovy web console中,我得到了一个有趣的结果:

0.1100 seconds

是否有人知道为什么会发生这种情况或如何解决?

1 个答案:

答案 0 :(得分:3)

这看起来像一个bug,TimeDuration包含1100毫秒,但是当它打印出来时,它会错误地将它转换为秒。

I've added it to the Groovy JIRA as a bug 编辑 版本2.0.6,1.8.9和2.1.0现已标记为已修复

与此同时,我猜你需要从TimeDuration到String进行自己的转换: - /


修改

你可以做这样的事情(并且可能有更简洁的方法)

groovy.time.TimeDuration.metaClass.normalize = { ->
  def newdmap = ['days','hours','minutes','seconds','millis'].collectEntries { 
    [ (it):delegate."$it" ]
  }.with { dmap ->
    [millis:1000,seconds:60,minutes:60,hours:24,days:-1].inject( [ dur:[ days:0, hours:0, minutes:0, seconds:0, millis:0 ], roll:0 ] ) { val, field ->
      val.dur."$field.key" = dmap."$field.key" + val.roll
      val.roll = val.dur."$field.key".intdiv( field.value )
      val.dur."$field.key" = field.value < 0 ?
                               val.dur."$field.key" :
                               val.dur."$field.key" % field.value
      val
    }.dur
  }
  new TimeDuration( newdmap.days, newdmap.hours, newdmap.minutes, newdmap.seconds, newdmap.millis )
}

这会为normalize添加TimeDuration方法,然后执行:

use(groovy.time.TimeCategory) {
    800.millisecond + 300.millisecond
}.normalize()

显示1.100 seconds

我没有对该方法进行过大量的测试,因此请注意它可以通过一些单元测试来确保它不会因其他情况而崩溃。