5

groovyで次のコードを実行すると-

import groovy.time.*
import org.codehaus.groovy.runtime.TimeCategory
def today = new Date()
use(TimeCategory)
{
  def modifiedToday = today.plus(10.minutes)
  modifiedToday = modifiedToday.plus(10.months)
  modifiedToday = modifiedToday.plus(10.years)
  def duration = modifiedToday - today
  println duration.years
  println duration.months
  println duration.days
  println duration.minutes
}

次の出力が得られます-

0
0
3956
10

なぜ私は年と月を0として取得し、すべての値を日数で取得しているのかを提案してください。年と月の値を取得するにはどうすればよいですか?

4

1 に答える 1

6

数ヶ月でどうやってそれを手に入れますか?

月ごとに日数が違うので、どうしますか?

次の手順を実行すると、これが表す日付を今から取り戻すことができます。

println duration.from.now

または、次の手順を実行して、過去を表す日付を取得できます。

println duration.ago

そこから解決できると思いますが、特定の日付に基づいてTimeDurationを正規化するための組み込み機能はありません。


編集

この種のものは、過去のある日付から指定された日付までロールバックします。ただし、実際のテストは行っていないので、重要な用途に使用する前に、注意して寿命をテストする必要があります...

import static java.util.Calendar.*
import groovy.time.DatumDependentDuration
import groovy.time.TimeCategory

DatumDependentDuration getAge( Date dob, Date now = new Date() ) {
  dob.clearTime()
  now.clearTime()
  assert dob < now
  Calendar.instance.with { c ->
    c.time = dob
    def (years, months, days) = [ 0, 0, 0 ]
   
    while( ( c[ YEAR ] < now[ YEAR ] - 1 ) || 
           ( c[ YEAR ] < now[ YEAR ] && c[ MONTH ] <= now[ MONTH ] ) ) {
      c.add( YEAR, 1 )
      years++
    }

    while( ( c[ YEAR ] < now[ YEAR ] ) ||
           ( c[ MONTH ] < now[ MONTH ] && c[ DAY_OF_MONTH ] <= now[ DAY_OF_MONTH ] ) ) {
      // Catch when we are wrapping the DEC/JAN border and would end up beyond now
      if( c[ YEAR ] == now[ YEAR ] - 1 &&
          now[ MONTH ] == JANUARY && c[ MONTH ] == DECEMBER &&
          c[ DAY_OF_MONTH ] > now[ DAY_OF_MONTH ] ) {
        break
      }
      c.add( MONTH, 1 )
      months++
    }

    while( c[ DAY_OF_YEAR ] != now[ DAY_OF_YEAR ] ) {
      c.add( DAY_OF_YEAR, 1 )
      days++
    }
    
    new DatumDependentDuration( years, months, days, 0, 0, 0, 0 )
  }
}

println getAge( Date.parse( 'dd/MM/yyyy', '11/10/2000' ) )

// Prints: '12 years, 2 months, 30 days'
于 2013-01-10T12:36:37.213 に答える