从速度日期中减去月份

Subtract months from date in velocity

我正在尝试从给定日期获取特定月数前的日期

我试过转换为日历然后使用添加方法,但这没有用:

#set( $myCalendar =  $date.toCalendar($endDate))
#set( $startdate = $calendarstart.add("MONTH", -$minusMonths))

我尝试了几种不同的方式来做到这一点:

#set( $temp =  0 - $numberOfMissedPremiums)
#evaluate($calendarstart.add( 2 , $temp ))
#set( $a = $calendarstart.add( 2 , $temp ))

我什至尝试过定义块,但这也没有用

Calendar.add() 方法采用一个整数,而不是字符串作为字段指示符。要更改月份,您需要 Calendar.MONTH 方法,即 2.

所以你会写:

#set( $startdate = $calendarstart.clone() )
$startdate.add(2, -$minusMonths)

此外,如果您仍在使用 Velocity 1.7,您可能需要这样写:

#set( $startdate = $calendarstart.clone() )
#set( $temp = 0 - $minusMonths )
$startdate.add(2, $temp)

为了使这段代码更简洁,您可以使用 FieldTool,您可以像这样配置它:

<tools>
  <toolbox scope="application">
    <tool key = "cal"
          class="org.apache.velocity.tools.generic.FieldTool"
          include="java.util.Date"/>
  </toolbox>
</tools>

所以你现在可以写:

#set( $startdate = $calendarstart.clone() )
$startdate = $calendarstart.add($cal.MONTH, -$minusMonths)

(我让你适配1.7版本)

最后一点,请花点时间考虑将此代码移至 Java 工具。 VTL 是一种模板语言,您尝试执行的操作看起来更像是业务逻辑任务。

(已编辑) 如@luis-rico 第一条评论所述,Calendar.add() returns 无效。 Calendar 是一个 mutable 对象,所以如果你想保留原来的 Calendar 实例,你必须先克隆它。然后你可以直接在模板中调用$startdate.add(2, -$minusMonth),因为不打印无效结果。

好的,所以我终于成功了:

#set( $minusmonths =  $math.mul($numberOfMonthsToSubtract,-1))    
#set( $Mycalendar = $date.getCalendar())   
#set( $Dateformat = "yyyy-MM-dd" )
$Mycalendar.setTime($convert.parseDate(
    $endDate, 
    $Dateformat
  ))
#set( $calConst = $field.in($Mycalendar) )
$Mycalendar.add($calConst.MONTH, $minusmonths.intValue())

问题似乎出在 Calendar.add() 没有正确解析值,它只接受 Int 并且正在接收一个数字。

我定义日历变量的方式也出现了一些问题。