|
From: <be...@us...> - 2006-09-04 14:57:29
|
Revision: 95
http://svn.sourceforge.net/objectlabkit/?rev=95&view=rev
Author: benoitx
Date: 2006-09-04 07:57:12 -0700 (Mon, 04 Sep 2006)
Log Message:
-----------
Force the Date/Calendar to be on UTC timezone. This then allows all tests to work in JDK.
Marcin, please genericise the PeriodCountCalculatorTest from Joda and use the data sets in JDK as well. Ta very much!
Modified Paths:
--------------
trunk/datecalc-common/src/main/java/net/objectlab/kit/datecalc/common/Utils.java
trunk/datecalc-common/src/test/java/net/objectlab/kit/datecalc/common/UtilsTest.java
trunk/datecalc-jdk/src/main/java/net/objectlab/kit/datecalc/jdk/CalendarPeriodCountCalculator.java
trunk/datecalc-jdk/src/test/java/net/objectlab/kit/datecalc/jdk/AbstractDateCalculatorTest.java
trunk/datecalc-jdk/src/test/java/net/objectlab/kit/datecalc/jdk/PeriodCountCalculatorTest.java
Modified: trunk/datecalc-common/src/main/java/net/objectlab/kit/datecalc/common/Utils.java
===================================================================
--- trunk/datecalc-common/src/main/java/net/objectlab/kit/datecalc/common/Utils.java 2006-09-04 12:32:55 UTC (rev 94)
+++ trunk/datecalc-common/src/main/java/net/objectlab/kit/datecalc/common/Utils.java 2006-09-04 14:57:12 UTC (rev 95)
@@ -23,6 +23,7 @@
import java.util.HashSet;
import java.util.List;
import java.util.Set;
+import java.util.TimeZone;
/**
* TODO javadoc
@@ -36,23 +37,28 @@
private static final String DATE_PATTERN = "yyyy-MM-dd";
private static final SimpleDateFormat SDF = new SimpleDateFormat(DATE_PATTERN);
- // TODO create tests
public static Calendar getCal(final Date date) {
final Calendar cal = Calendar.getInstance();
cal.setTime(date);
+ cal.setTimeZone(TimeZone.getTimeZone("UTC"));
+ cal.set(Calendar.HOUR, 0);
+ cal.set(Calendar.MINUTE, 0);
+ cal.set(Calendar.SECOND, 0);
+ cal.set(Calendar.MILLISECOND, 0);
return cal;
}
public static Date createDate(final String str) throws IllegalArgumentException {
try {
- return SDF.parse(str);
+ Date date = SDF.parse(str);
+ Calendar cal = getCal(date);
+ return cal.getTime();
} catch (final ParseException e) {
throw new IllegalArgumentException("\"" + str + "\"" + " is an invalid date, the pattern is : " + DATE_PATTERN);
}
}
- public static Set<Calendar> toCalendarSet(Set<Date> dates) {
-
+ public static Set<Calendar> toCalendarSet(Set<Date> dates) {
Set<Calendar> calendars = new HashSet<Calendar>();
for (Date date : dates) {
calendars.add(getCal(date));
Modified: trunk/datecalc-common/src/test/java/net/objectlab/kit/datecalc/common/UtilsTest.java
===================================================================
--- trunk/datecalc-common/src/test/java/net/objectlab/kit/datecalc/common/UtilsTest.java 2006-09-04 12:32:55 UTC (rev 94)
+++ trunk/datecalc-common/src/test/java/net/objectlab/kit/datecalc/common/UtilsTest.java 2006-09-04 14:57:12 UTC (rev 95)
@@ -8,50 +8,55 @@
import java.util.HashSet;
import java.util.List;
import java.util.Set;
+import java.util.TimeZone;
import junit.framework.TestCase;
public class UtilsTest extends TestCase {
SimpleDateFormat sdf;
+
Calendar cal;
+
Set<Calendar> calendarSet;
+
Set<Date> dateSet;
-
+
protected void setUp() throws Exception {
sdf = new SimpleDateFormat("yyyy-MM-dd");
-
+
calendarSet = new HashSet<Calendar>();
calendarSet.add(getCal(2004, 5, 31));
calendarSet.add(getCal(2083, 12, 1));
-
+
dateSet = new HashSet<Date>();
- dateSet.add(sdf.parse("2004-05-31"));
- dateSet.add(sdf.parse("2083-12-01"));
+ dateSet.add(getCal(2004, 5, 31).getTime());
+ dateSet.add(getCal(2083, 12, 1).getTime());
}
private Calendar getCal(int year, int month, int day) {
Calendar cal = Calendar.getInstance();
cal.clear();
- cal.set(year, month-1, day, 0, 0, 0);
+ cal.setTimeZone(TimeZone.getTimeZone("UTC"));
+ cal.set(year, month - 1, day, 0, 0, 0);
return cal;
}
public void testGetCal() throws Exception {
-
+
Date d = sdf.parse("2004-02-03");
assertEquals(Utils.getCal(d).getTime(), getCal(2004, 2, 3).getTime());
-
+
Date d1 = getCal(2080, 5, 31).getTime();
Date d2 = getCal(2080, 5, 31).getTime();
assertEquals(Utils.getCal(d1).getTime(), d2);
}
public void testCreateDate() throws Exception {
-
- assertEquals(sdf.parse("1970-01-01"), Utils.createDate("1970-01-01"));
- assertEquals(sdf.parse("2020-12-31"), Utils.createDate("2020-12-31"));
+ assertEquals(getCal(1970, 1, 1).getTime(), Utils.createDate("1970-01-01"));
+ assertEquals(getCal(2020, 12, 31).getTime(), Utils.createDate("2020-12-31"));
+
assertEquals(getCal(2006, 8, 8).getTime(), Utils.createDate("2006-08-08"));
assertEquals(getCal(2004, 9, 12).getTime(), Utils.createDate("2004-09-12"));
}
@@ -65,10 +70,10 @@
}
public void testToDateList() {
-
+
List<Date> expected = new ArrayList<Date>(dateSet);
Collections.sort(expected);
-
+
List<Date> actual = Utils.toDateList(new ArrayList<Calendar>(calendarSet));
Collections.sort(actual);
assertEquals(expected, actual);
Modified: trunk/datecalc-jdk/src/main/java/net/objectlab/kit/datecalc/jdk/CalendarPeriodCountCalculator.java
===================================================================
--- trunk/datecalc-jdk/src/main/java/net/objectlab/kit/datecalc/jdk/CalendarPeriodCountCalculator.java 2006-09-04 12:32:55 UTC (rev 94)
+++ trunk/datecalc-jdk/src/main/java/net/objectlab/kit/datecalc/jdk/CalendarPeriodCountCalculator.java 2006-09-04 14:57:12 UTC (rev 95)
@@ -18,24 +18,25 @@
package net.objectlab.kit.datecalc.jdk;
import java.util.Calendar;
+import java.util.TimeZone;
import net.objectlab.kit.datecalc.common.PeriodCountBasis;
import net.objectlab.kit.datecalc.common.PeriodCountCalculator;
/**
* TODO javadoc
- *
+ *
* @author Marcin Jekot
* @author $LastChangedBy$
* @version $Revision$ $Date$
- *
+ *
*/
public class CalendarPeriodCountCalculator implements PeriodCountCalculator<Calendar> {
- private double MILLIS_IN_DAY = 1000 * 60 * 60 * 24;
-
+ private static final long MILLIS_IN_DAY = 1000L * 60L * 60L * 24L;
+
public int dayDiff(final Calendar start, final Calendar end, final PeriodCountBasis basis) {
-
+
int diff = 0;
if (basis == PeriodCountBasis.CONV_30_360) {
@@ -47,8 +48,8 @@
if (dayStart == MONTH_31_DAYS) {
dayStart = MONTH_30_DAYS;
}
- diff = (end.get(Calendar.YEAR) - start.get(Calendar.YEAR)) * YEAR_360 + (end.get(Calendar.MONTH) - start.get(Calendar.MONTH)) * MONTH_30_DAYS
- + dayEnd - dayStart;
+ diff = (end.get(Calendar.YEAR) - start.get(Calendar.YEAR)) * YEAR_360
+ + (end.get(Calendar.MONTH) - start.get(Calendar.MONTH)) * MONTH_30_DAYS + dayEnd - dayStart;
} else if (basis == PeriodCountBasis.CONV_360E_ISDA) {
int dayStart = start.get(Calendar.DAY_OF_MONTH);
@@ -61,8 +62,8 @@
dayStart = MONTH_30_DAYS;
}
- diff = (end.get(Calendar.YEAR) - start.get(Calendar.YEAR)) * YEAR_360 + (end.get(Calendar.MONTH) - start.get(Calendar.MONTH)) * MONTH_30_DAYS
- + dayEnd - dayStart;
+ diff = (end.get(Calendar.YEAR) - start.get(Calendar.YEAR)) * YEAR_360
+ + (end.get(Calendar.MONTH) - start.get(Calendar.MONTH)) * MONTH_30_DAYS + dayEnd - dayStart;
} else if (basis == PeriodCountBasis.CONV_360E_ISMA) {
int dayStart = start.get(Calendar.DAY_OF_MONTH);
@@ -73,17 +74,21 @@
if (dayStart == MONTH_31_DAYS) {
dayStart = MONTH_30_DAYS;
}
- diff = (end.get(Calendar.YEAR) - start.get(Calendar.YEAR)) * YEAR_360 + (end.get(Calendar.MONTH) - start.get(Calendar.MONTH)) * MONTH_30_DAYS
- + dayEnd - dayStart;
+ diff = (end.get(Calendar.YEAR) - start.get(Calendar.YEAR)) * YEAR_360
+ + (end.get(Calendar.MONTH) - start.get(Calendar.MONTH)) * MONTH_30_DAYS + dayEnd - dayStart;
} else {
- diff = dayDiff(start, end);
+ diff = dayDiff(start, end);
}
return diff;
}
private int dayDiff(final Calendar start, final Calendar end) {
- // TODO the 12 hours is just for safety - in case DST kicked in, but is there a better way?
- return (int)((Math.abs(start.getTime().getTime() - end.getTime().getTime()) + 12) / MILLIS_IN_DAY);
+// System.out.println("start:" + start.getTime() + " end:" + end.getTime());
+ long diff = Math.abs(start.getTimeInMillis() - end.getTimeInMillis());
+// System.out.println("ms diff:" + diff);
+ double dayDiff = ((double)diff) / MILLIS_IN_DAY;
+// System.out.println("day diff:" + dayDiff);
+ return (int) (dayDiff);
}
public double monthDiff(final Calendar start, final Calendar end, final PeriodCountBasis basis) {
@@ -103,9 +108,9 @@
final int diff1 = dayDiff(start, endOfStartYear);
final int diff2 = dayDiff(startOfEndYear, end);
-
+
diff = (diff1 + 1.0) / start.getMaximum(Calendar.DAY_OF_YEAR) + (endYear - startYear - 1.0) + (diff2)
- / (double) end.getMaximum(Calendar.DAY_OF_YEAR);
+ / (double) end.getMaximum(Calendar.DAY_OF_YEAR);
}
} else if (basis == PeriodCountBasis.CONV_30_360 || basis == PeriodCountBasis.CONV_360E_ISDA
Modified: trunk/datecalc-jdk/src/test/java/net/objectlab/kit/datecalc/jdk/AbstractDateCalculatorTest.java
===================================================================
--- trunk/datecalc-jdk/src/test/java/net/objectlab/kit/datecalc/jdk/AbstractDateCalculatorTest.java 2006-09-04 12:32:55 UTC (rev 94)
+++ trunk/datecalc-jdk/src/test/java/net/objectlab/kit/datecalc/jdk/AbstractDateCalculatorTest.java 2006-09-04 14:57:12 UTC (rev 95)
@@ -1,13 +1,11 @@
package net.objectlab.kit.datecalc.jdk;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
-import junit.framework.Assert;
import junit.framework.TestCase;
+import net.objectlab.kit.datecalc.common.Utils;
public abstract class AbstractDateCalculatorTest extends TestCase {
@@ -15,16 +13,8 @@
super();
}
- private static final SimpleDateFormat SDF = new SimpleDateFormat("yyyy-MM-dd");
-
- // TODO remove this and use utils one instead
protected Date createDate(final String str) {
- try {
- return SDF.parse(str);
- } catch (final ParseException e) {
- Assert.fail(e.toString());
- }
- return null;
+ return Utils.createDate(str);
}
protected Set<Date> createUKHolidays() {
Modified: trunk/datecalc-jdk/src/test/java/net/objectlab/kit/datecalc/jdk/PeriodCountCalculatorTest.java
===================================================================
--- trunk/datecalc-jdk/src/test/java/net/objectlab/kit/datecalc/jdk/PeriodCountCalculatorTest.java 2006-09-04 12:32:55 UTC (rev 94)
+++ trunk/datecalc-jdk/src/test/java/net/objectlab/kit/datecalc/jdk/PeriodCountCalculatorTest.java 2006-09-04 14:57:12 UTC (rev 95)
@@ -47,6 +47,7 @@
{ "0D", "2008-02-29", "2008-02-29", "ACT_365", "0", "0.00" },
{ "1D", "2008-02-29", "2008-03-03", "ACT_365", "3", "0.008219" },
{ "1W", "2008-02-29", "2008-03-07", "ACT_365", "7", "0.019178" },
+ { "1M", "2008-02-28", "2008-03-31", "ACT_365", "32", "0.087671" }, // new
{ "1M", "2008-02-29", "2008-03-31", "ACT_365", "31", "0.084932" },
{ "3M", "2008-02-29", "2008-05-29", "ACT_365", "90", "0.246575" },
{ "6M", "2008-02-29", "2008-08-29", "ACT_365", "182", "0.498630" },
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|