Вычтите месяцы из даты в скорости - PullRequest
0 голосов
/ 24 июня 2019

Я пытаюсь получить дату определенное количество месяцев назад от данной даты

Я пытался преобразовать в Календарь, чтобы затем использовать метод добавления, но это не сработало:

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

Я даже пытался определить блоки, но это тоже не сработало

Ответы [ 2 ]

1 голос
/ 25 июня 2019

Метод 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) в шаблоне, так как пустые результаты не будут напечатаны.

0 голосов
/ 27 июня 2019

ОК, так что мне, наконец, удалось заставить его работать:

#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 и былполучение числа.

То, как я определял переменную календаря, также вызывало некоторые проблемы.

...