0

我正在尝试从给定日期获取几个月前的日期

我尝试转换为 Calendar 以使用 add 方法,但这不起作用:

#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 ))

我什至尝试过定义块,但这也不起作用

4

2 回答 2

1

Calendar.add() 方法采用 int 而非字符串作为字段指示符。要更改月份,您需要 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()返回 void。Calendar 是一个可变对象,因此如果要保留原始 Calendar 实例,则必须先克隆它。然后您可以直接调用$startdate.add(2, -$minusMonth)模板,因为不会打印 void 结果。

于 2019-06-25T19:09:18.200 回答
0

好的,所以我终于设法让它工作了:

#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 并且正在接收数字。

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

于 2019-06-27T09:54:12.940 回答