Top Description Inners Fields Constructors Methods
org.apache.poi.ss.formula.atp

pack-priv final Class YearFracCalculator

extends Object
Class Inheritance
Annotations
@Internal
Imports
java.util.Calendar, org.apache.poi.ss.formula.eval.ErrorEval, .EvaluationException, org.apache.poi.ss.usermodel.DateUtil, org.apache.poi.util.Internal, .LocaleUtil

Internal calculation methods for Excel 'Analysis ToolPak' function YEARFRAC()
Algorithm inspired by www.dwheeler.com/yearfrac

Nested and Inner Type Summary

Modifier and TypeClass and Description
private static class

Field Summary

Modifier and TypeField and Description
private static final int
private static final int
private static final int
private static final int
LONG_MONTH_LEN

the length of normal long months i.e. 31

private static final int
private static final int
private static final int
private static final int
SHORT_MONTH_LEN

the length of normal short months i.e. 30

Constructor Summary

AccessConstructor and Description
private

Method Summary

Modifier and TypeMethod and Description
private static double
averageYearLength(int startYear, int endYear)

private static double
basis0(int
assumed to be less than or equal to endDateVal
startDateVal
,
int
assumed to be greater than or equal to startDateVal
endDateVal
)

private static double
basis1(int
assumed to be less than or equal to endDateVal
startDateVal
,
int
assumed to be greater than or equal to startDateVal
endDateVal
)

private static double
basis2(int
assumed to be less than or equal to endDateVal
startDateVal
,
int
assumed to be greater than or equal to startDateVal
endDateVal
)

private static double
basis3(double
assumed to be less than or equal to endDateVal
startDateVal
,
double
assumed to be greater than or equal to startDateVal
endDateVal
)

private static double
basis4(int
assumed to be less than or equal to endDateVal
startDateVal
,
int
assumed to be greater than or equal to startDateVal
endDateVal
)

public static double
calculate(double pStartDateVal, double pEndDateVal, int basis)

private static double
calculateAdjusted(YearFracCalculator.SimpleDate startDate, YearFracCalculator.SimpleDate endDate, int date1day, int date2day)

private static YearFracCalculator.SimpleDate
createDate(int dayCount)

private static int

Returns:

the whole number of days between the two time-stamps. Both time-stamps are assumed to represent 12:00 midnight on the respective day.
dateDiff
(long startDateMS, long endDateMS)

private static int
private static boolean
private static boolean
private static boolean
isLeapYear(int i)

private static boolean

Returns:

true if dates both within a leap year, or span a period including Feb 29
shouldCountFeb29
(YearFracCalculator.SimpleDate start, YearFracCalculator.SimpleDate end)

Assumes dates are no more than 1 year apart.

Inherited from java.lang.Object:
cloneequalsfinalizegetClasshashCodenotifynotifyAlltoStringwaitwaitwait

Field Detail

DAYS_PER_LEAP_YEARback to summary
private static final int DAYS_PER_LEAP_YEAR
DAYS_PER_NORMAL_YEARback to summary
private static final int DAYS_PER_NORMAL_YEAR
LONG_FEB_LENback to summary
private static final int LONG_FEB_LEN
LONG_MONTH_LENback to summary
private static final int LONG_MONTH_LEN

the length of normal long months i.e. 31

MS_PER_DAYback to summary
private static final int MS_PER_DAY
MS_PER_HOURback to summary
private static final int MS_PER_HOUR
SHORT_FEB_LENback to summary
private static final int SHORT_FEB_LEN
SHORT_MONTH_LENback to summary
private static final int SHORT_MONTH_LEN

the length of normal short months i.e. 30

Constructor Detail

YearFracCalculatorback to summary
private YearFracCalculator()

Method Detail

averageYearLengthback to summary
private static double averageYearLength(int startYear, int endYear)
basis0back to summary
private static double basis0(int startDateVal, int endDateVal)
Parameters
startDateVal:int

assumed to be less than or equal to endDateVal

endDateVal:int

assumed to be greater than or equal to startDateVal

basis1back to summary
private static double basis1(int startDateVal, int endDateVal)
Parameters
startDateVal:int

assumed to be less than or equal to endDateVal

endDateVal:int

assumed to be greater than or equal to startDateVal

basis2back to summary
private static double basis2(int startDateVal, int endDateVal)
Parameters
startDateVal:int

assumed to be less than or equal to endDateVal

endDateVal:int

assumed to be greater than or equal to startDateVal

basis3back to summary
private static double basis3(double startDateVal, double endDateVal)
Parameters
startDateVal:double

assumed to be less than or equal to endDateVal

endDateVal:double

assumed to be greater than or equal to startDateVal

basis4back to summary
private static double basis4(int startDateVal, int endDateVal)
Parameters
startDateVal:int

assumed to be less than or equal to endDateVal

endDateVal:int

assumed to be greater than or equal to startDateVal

calculateback to summary
public static double calculate(double pStartDateVal, double pEndDateVal, int basis) throws EvaluationException
calculateAdjustedback to summary
private static double calculateAdjusted(YearFracCalculator.SimpleDate startDate, YearFracCalculator.SimpleDate endDate, int date1day, int date2day)
createDateback to summary
private static YearFracCalculator.SimpleDate createDate(int dayCount)
dateDiffback to summary
private static int dateDiff(long startDateMS, long endDateMS)
Returns:int

the whole number of days between the two time-stamps. Both time-stamps are assumed to represent 12:00 midnight on the respective day.

getLastDayOfMonthback to summary
private static int getLastDayOfMonth(YearFracCalculator.SimpleDate date)
isGreaterThanOneYearback to summary
private static boolean isGreaterThanOneYear(YearFracCalculator.SimpleDate start, YearFracCalculator.SimpleDate end)
isLastDayOfMonthback to summary
private static boolean isLastDayOfMonth(YearFracCalculator.SimpleDate date)
isLeapYearback to summary
private static boolean isLeapYear(int i)
shouldCountFeb29back to summary
private static boolean shouldCountFeb29(YearFracCalculator.SimpleDate start, YearFracCalculator.SimpleDate end)

Assumes dates are no more than 1 year apart.

Returns:boolean

true if dates both within a leap year, or span a period including Feb 29

org.apache.poi.ss.formula.atp back to summary

private final Class YearFracCalculator.SimpleDate

extends Object
Class Inheritance

Field Summary

Modifier and TypeField and Description
public final int
day

day of month

public static final int
public static final int
public final int
month

1-based month

public final long
tsMilliseconds

milliseconds since 1970

public final int

Constructor Summary

AccessConstructor and Description
public

Method Summary

Inherited from java.lang.Object:
cloneequalsfinalizegetClasshashCodenotifynotifyAlltoStringwaitwaitwait

Field Detail

dayback to summary
public final int day

day of month

FEBRUARYback to summary
public static final int FEBRUARY
JANUARYback to summary
public static final int JANUARY
monthback to summary
public final int month

1-based month

tsMillisecondsback to summary
public final long tsMilliseconds

milliseconds since 1970

yearback to summary
public final int year

Constructor Detail

SimpleDateback to summary
public SimpleDate(Calendar cal)