【问题标题】:Groovy: Get duration in yearsGroovy:以年为单位获取持续时间
【发布时间】:2013-01-10 12:24:11
【问题描述】:

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

【问题讨论】:

    标签: date groovy duration


    【解决方案1】:

    几个月后你会如何得到它?

    每个月都有不同的天数,那你会怎么做呢?

    您可以通过以下方式取回这代表的日期:

    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 "每个月的天数都不一样,你会怎么做呢?"
    • 例如,假设我想以年/月/日为单位计算一个人的年龄(这一天),并且我有他的出生日期。
    • @SoftEngi 写了一个函数来做到这一点......可能有更干净的方法,正如我所说,我对它做了最少的测试(显示的案例是唯一的测试,我 相信是对的)
    猜你喜欢
    • 1970-01-01
    • 2015-03-10
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    • 2013-10-13
    • 2011-04-24
    相关资源
    最近更新 更多