1:
31: package ;
32:
33: import ;
34: import ;
35: import ;
36: import ;
37: import ;
38:
39: import ;
40: import ;
41: import ;
42: import ;
43: import ;
44: import ;
45: import ;
46: import ;
47: import ;
48:
49:
64: public class DateDifFunction implements Function
65: {
66: public static final String YEARS_CODE = "y";
67: public static final String MONTHS_CODE = "m";
68: public static final String DAYS_CODE = "d";
69: public static final String DAYS_IGNORING_YEARS = "yd";
70: public static final String MONTHS_IGNORING_YEARS = "ym";
71: public static final String DAYS_IGNORING_MONTHS_YEARS = "md";
72:
73:
74:
75:
76:
77:
78:
79: public DateDifFunction()
80: {
81: }
82:
83: public String getCanonicalName()
84: {
85: return "DATEDIF";
86: }
87:
88: public TypeValuePair evaluate(final FormulaContext context,
89: final ParameterCallback parameters)
90: throws EvaluationException
91: {
92: if (parameters.getParameterCount() != 3)
93: {
94: throw new EvaluationException(LibFormulaErrorValue.ERROR_ARGUMENTS_VALUE);
95: }
96:
97: final TypeRegistry typeRegistry = context.getTypeRegistry();
98: final Date date1 = typeRegistry.convertToDate
99: (parameters.getType(0), parameters.getValue(0));
100: final Date date2 = typeRegistry.convertToDate
101: (parameters.getType(1), parameters.getValue(1));
102: final String formatCode = typeRegistry.convertToText
103: (parameters.getType(2), parameters.getValue(2));
104:
105: if (date1 == null || date2 == null || formatCode == null || "".equals(
106: formatCode))
107: {
108: throw new EvaluationException(
109: LibFormulaErrorValue.ERROR_INVALID_ARGUMENT_VALUE);
110: }
111:
112: final LocalizationContext localizationContext = context.getLocalizationContext();
113: final TimeZone timeZone = localizationContext.getTimeZone();
114: final Locale locale = localizationContext.getLocale();
115: final GregorianCalendar calandar1 =
116: new GregorianCalendar(timeZone, locale);
117: calandar1.setTime(date1);
118:
119: final GregorianCalendar calandar2 =
120: new GregorianCalendar(timeZone, locale);
121: calandar2.setTime(date2);
122:
123: int res;
124:
125: if (DateDifFunction.YEARS_CODE.equals(formatCode))
126: {
127: res = calandar2.get(Calendar.YEAR) - calandar1.get(Calendar.YEAR);
128: }
129: else if (DateDifFunction.MONTHS_CODE.equals(formatCode))
130: {
131: final int month1 = calandar1.get(Calendar.MONTH);
132: final int month2 = calandar2.get(Calendar.MONTH);
133: final int year1 = calandar1.get(Calendar.YEAR);
134: final int year2 = calandar2.get(Calendar.YEAR);
135:
136: res = (year2 - year1) * 12 +
137: month2 - month1;
138: }
139: else if (DateDifFunction.DAYS_IGNORING_MONTHS_YEARS.equals(formatCode))
140: {
141:
142:
143:
144:
145: calandar1.set(Calendar.YEAR, calandar2.get(Calendar.YEAR));
146: calandar1.set(Calendar.MONTH, calandar2.get(Calendar.MONTH));
147:
148: res = calandar2.get(Calendar.DAY_OF_MONTH) -
149: calandar1.get(Calendar.DAY_OF_MONTH);
150: }
151: else if (DateDifFunction.DAYS_CODE.equals(formatCode))
152: {
153: final int dayOfYear1 = calandar1.get(Calendar.DAY_OF_YEAR);
154: final int dayOfYear2 = calandar2.get(Calendar.DAY_OF_YEAR);
155: final int year1 = calandar1.get(Calendar.YEAR);
156: final int year2 = calandar2.get(Calendar.YEAR);
157:
158: final GregorianCalendar workingCalandar =
159: new GregorianCalendar(timeZone, locale);
160:
161: res = dayOfYear2 - dayOfYear1;
162:
163:
164:
165:
166: final int targetYear = Math.max(year1, year2);
167: for (int i = Math.min(year1, year2); i < targetYear; i++)
168: {
169: workingCalandar.set(Calendar.YEAR, i);
170: res += workingCalandar.getActualMaximum(Calendar.DAY_OF_YEAR);
171: }
172: }
173: else if (DateDifFunction.MONTHS_IGNORING_YEARS.equals(formatCode))
174: {
175: final int month1 = calandar1.get(Calendar.MONTH);
176: final int month2 = calandar2.get(Calendar.MONTH);
177:
178: res = month2 - month1;
179: }
180: else if (DateDifFunction.DAYS_IGNORING_YEARS.equals(formatCode))
181: {
182:
183:
184:
185:
186:
187:
188:
189: calandar1.set(Calendar.YEAR, calandar2.get(Calendar.YEAR));
190: final int dayOne = calandar1.get(Calendar.DAY_OF_YEAR);
191: final int dayTwo = calandar2.get(Calendar.DAY_OF_YEAR);
192: res = Math.abs(dayOne - dayTwo);
193: }
194: else
195: {
196: throw new EvaluationException(
197: LibFormulaErrorValue.ERROR_INVALID_ARGUMENT_VALUE);
198: }
199:
200: if (res < 0)
201: {
202: throw new EvaluationException(
203: LibFormulaErrorValue.ERROR_INVALID_ARGUMENT_VALUE);
204: }
205:
206: return new TypeValuePair(NumberType.GENERIC_NUMBER, new Integer(res));
207: }
208: }