Метод 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 является объектом mutable , поэтому, если вы хотите сохранить исходный экземпляр Calendar, вам сначала нужно его клонировать. Затем вы можете напрямую вызвать $startdate.add(2, -$minusMonth)
в шаблоне, так как пустые результаты не будут напечатаны.