Groovy:获取年限

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,而所有的值都是以天为单位。如何获得年份和月份的值?

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'

+1 "每个月的天数都不同,那你会怎么做?" - Will
例如,假设我想要计算一个人在今天的年龄(以年/月/日为单位),而我手头有他的出生日期。 - SoftEngi
@SoftEngi 写了一个函数来实现这个...可能有更简洁的方法,就像我说的,我只对它进行了最少的测试(所展示的情况是唯一的测试,而且我相信它是正确的) - tim_yates

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接