2

このサンプルコードを試すと:

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

Groovy Webコンソールでは、面白い結果が得られます。

0.1100 seconds

なぜこれが起こるのか、またはそれを修正する方法を知っている人はいますか?

4

1 に答える 1

3

これはバグのように見えます。TimeDuration には 1100 ミリ秒が含まれていますが、出力すると、誤って秒に変換されます。

バグ編集 としてGroovy JIRAに追加しましたバージョン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

私はその方法で大量のテストを行っていないので、他の状況で失敗しないことを確認するために、いくつかの単体テストで行うことができることに注意してください.

于 2012-10-11T08:27:26.710 に答える