从速度日期中减去月份
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 并且正在接收一个数字。
我定义日历变量的方式也出现了一些问题。
我正在尝试从给定日期获取特定月数前的日期
我试过转换为日历然后使用添加方法,但这没有用:
#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 并且正在接收一个数字。
我定义日历变量的方式也出现了一些问题。