public ValueEval evaluate(ValueEval[] args, OperationEvaluationContext ec) {if (args.length != 2) {return ErrorEval.VALUE_INVALID;}try {double startDateAsNumber = NumericFunction.singleOperandEvaluate(args[0], ec.getRowIndex(), ec.getColumnIndex());int months = (int) NumericFunction.singleOperandEvaluate(args[1], ec.getRowIndex(), ec.getColumnIndex());if (startDateAsNumber >= 0.0 && startDateAsNumber < 1.0) {startDateAsNumber = 1.0;}Date startDate = DateUtil.getJavaDate(startDateAsNumber, false);Calendar cal = LocaleUtil.getLocaleCalendar();cal.setTime(startDate);cal.clear(Calendar.HOUR);cal.set(Calendar.HOUR_OF_DAY, 0);cal.clear(Calendar.MINUTE);cal.clear(Calendar.SECOND);cal.clear(Calendar.MILLISECOND);cal.add(Calendar.MONTH, months + 1);cal.set(Calendar.DAY_OF_MONTH, 1);cal.add(Calendar.DAY_OF_MONTH, -1);return new NumberEval(DateUtil.getExcelDate(cal.getTime()));} catch (EvaluationException e) {return e.getErrorEval();}}

public ValueEval evaluate ( ValueEval [ ] args , OperationEvaluationContext ec ) { if ( args . length != 2 ) { return ErrorEval . VALUE_INVALID ; } try { double startDateAsNumber = NumericFunction . singleOperandEvaluate ( args [ 0 ] , ec . getRowIndex ( ) , ec . getColumnIndex ( ) ) ; int months = ( int ) NumericFunction . singleOperandEvaluate ( args [ 1 ] , ec . getRowIndex ( ) , ec . getColumnIndex ( ) ) ; if ( startDateAsNumber >= 0.0 && startDateAsNumber < 1.0 ) { startDateAsNumber = 1.0 ; } Date startDate = DateUtil . getJavaDate ( startDateAsNumber , false ) ; Calendar cal = LocaleUtil . getLocaleCalendar ( ) ; cal . setTime ( startDate ) ; cal . clear ( Calendar . HOUR ) ; cal . set ( Calendar . HOUR_OF_DAY , 0 ) ; cal . clear ( Calendar . MINUTE ) ; cal . clear ( Calendar . SECOND ) ; cal . clear ( Calendar . MILLISECOND ) ; cal . add ( Calendar . MONTH , months + 1 ) ; cal . set ( Calendar . DAY_OF_MONTH , 1 ) ; cal . add ( Calendar . DAY_OF_MONTH , - 1 ) ; return new NumberEval ( DateUtil . getExcelDate ( cal . getTime ( ) ) ) ; } catch ( EvaluationException e ) { return e . getErrorEval ( ) ; } }
public ValueEval Evaluate(ValueEval[] args, OperationEvaluationContext ec){if (args.Length != 2){return ErrorEval.VALUE_INVALID;}try{double startDateAsNumber = NumericFunction.SingleOperandEvaluate(args[0], ec.RowIndex, ec.ColumnIndex);int months = (int)NumericFunction.SingleOperandEvaluate(args[1], ec.RowIndex, ec.ColumnIndex);if (startDateAsNumber >= 0.0 && startDateAsNumber < 1.0){startDateAsNumber = 1.0;}DateTime startDate = DateUtil.GetJavaDate(startDateAsNumber, false);DateTime dtEnd = startDate.AddMonths(months);dtEnd = dtEnd.AddMonths(1);dtEnd = new DateTime(dtEnd.Year, dtEnd.Month, 1);dtEnd = dtEnd.AddDays(-1);return new NumberEval(DateUtil.GetExcelDate(dtEnd));}catch (EvaluationException e){return e.GetErrorEval();}}
