如何获得Velocity中准确的日期差

时间:2019-08-23 14:01:23

标签: java velocity

我正在使用Velocity,并且希望获得两个日期之间整整一年的准确日期差异。如果您使用this tool,则将看到在这两个日期之间已经有64个整年的时间。我能得到的速度就是65岁

我尝试了以下代码:

($ date是dateTool,$ compareDate是ComparisonDateTool,而$ number是NumberTool)

#set( $defaultTimeZone = $date.getTimeZone().getTimeZone("GMT") )
#set( $defaultLocale = $date.getLocale() )
#set( $ISO8601 = "yyyy-MM-dd'T'HH:mm:ss" )

#set ($resDateObj = $date.toDate($ISO8601,"1954-06-26T00:00:00",$defaultLocale,$defaultTimeZone))
#set ($incepDateObj = $date.toDate($ISO8601,"2019-06-20T00:00:00",$defaultLocale,$defaultTimeZone))

#set($diffRemaining = $compareDate.difference($resDateObj, $incepDateObj).getYears())
#set($weeksRemaining = $number.toNumber($diffRemaining).intValue())

years is: $weeksRemaining

此代码的输出是: 年是:65

我想这是to年,因为普通年(365天)的总数是6502.74。

实际上,已经过去了64年11个月25天。关于如何使Velocity返回64进行计算的任何想法。

1 个答案:

答案 0 :(得分:0)

ComparisonDateTool的实现非常中断,因为它只计算日期之间的毫秒数,然后通过除以常数来估算年,月和日。

您可以使用Calendar对象按年,月和日细分计算:

#set( $defaultTimeZone = $date.getTimeZone().getTimeZone("GMT") )
#set( $defaultLocale = $date.getLocale() )
#set( $ISO8601 = "yyyy-MM-dd'T'HH:mm:ss" )

#set ($resDateObj = $date.toDate($ISO8601,"1954-06-26T00:00:00"))
#set ($incepDateObj = $date.toDate($ISO8601,"2019-06-20T00:00:00"))

#set ($resCalObj = $date.toCalendar($resDateObj))
#set ($incepCalObj = $date.toCalendar($incepDateObj))

## years
#set($years = $incepCalObj.get(1) - $resCalObj.get(1))

## months
#set($months = $incepCalObj.get(2) - $resCalObj.get(2))
#if($months < 0)
  #set($years = $years - 1)
  #set($months = $months + 12)
#end

## days
#set($days = $incepCalObj.get(5) - $resCalObj.get(5))
#if($days < 0)
  #set($months = $months - 1)
  #if($months < 0)
    #set($years = $years - 1)
    #set($months = $months + 12)
  #end
  ## go to previous month
  $incepCalObj.add(2, -1)
  #set($days = $days + $incepCalObj.getActualMaximum(5))
#end

years: $years
months: $months
days: $days

wich给出结果:

years: 64
months: 11
days: 25

您应该注意,此代码实际上并不属于模板。该计算应在Java端使用您自己的工具进行。

(已修改以固定天数,可以正确定义 ) (已修改以修改月份变量名称)