Index: src/java/org/apache/poi/ss/formula/functions/Days.java =================================================================== --- src/java/org/apache/poi/ss/formula/functions/Days.java (revision 0) +++ src/java/org/apache/poi/ss/formula/functions/Days.java (working copy) @@ -0,0 +1,80 @@ +/* ==================================================================== + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +==================================================================== */ +package org.apache.poi.ss.formula.functions; + +import java.util.Calendar; + +import org.apache.poi.ss.formula.eval.EvaluationException; +import org.apache.poi.ss.formula.eval.NumberEval; +import org.apache.poi.ss.formula.eval.OperandResolver; +import org.apache.poi.ss.formula.eval.ValueEval; +import org.apache.poi.ss.usermodel.DateUtil; +import org.apache.poi.util.LocaleUtil; + +/** + *

Calculates the number of days between two dates based on a real year + * , which is used in some accounting calculations. Use + * this function to help compute payments if your accounting system is based on + * twelve 30-day months.

+ * + *

+ * {@code DAYS(end_date,start_date)} + * + *

+ *

+ * + * @see DAYS function - Microsoft Office + */ +public class Days extends Fixed2ArgFunction { + + private final static long MILLIS_PER_DAY = 1000*60*60*24; + + public ValueEval evaluate(int srcRowIndex, int srcColumnIndex, ValueEval arg0, ValueEval arg1) { + double result; + try { + double d0 = NumericFunction.singleOperandEvaluate(arg0, srcRowIndex, srcColumnIndex); + double d1 = NumericFunction.singleOperandEvaluate(arg1, srcRowIndex, srcColumnIndex); + result = evaluate(d0, d1); + } catch (EvaluationException e) { + return e.getErrorEval(); + } + return new NumberEval(result); + } + + private static double evaluate(double d0, double d1) { + Calendar endDate = getDate(d0); + Calendar startDate = getDate(d1); + + return daysBetween(startDate.getTimeInMillis(), endDate.getTimeInMillis()); + } + + private static Calendar getDate(double date) { + Calendar processedDate = LocaleUtil.getLocaleCalendar(); + processedDate.setTime(DateUtil.getJavaDate(date, false)); + return processedDate; + } + + /** Replace me with org.joda.time.Days.daysBetween */ + private static double daysBetween(long start, long end) { + return (end - start) / MILLIS_PER_DAY; + } +} Property changes on: src/java/org/apache/poi/ss/formula/functions/Days.java ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property