Revision: 4741 http://sourceforge.net/p/vexi/code/4741 Author: mkpg2 Date: 2014-10-28 08:32:22 +0000 (Tue, 28 Oct 2014) Log Message: ----------- Support adding non-integer hours/mins to dates.
Modified Paths: -------------- branches/vexi3/org.vexi-library.js/src/main/java/org/ibex/js/JSU.java branches/vexi3/org.vexi-library.js/src/main/jpp/org/ibex/js/JSDate.jpp branches/vexi3/org.vexi-library.value/src/main/java/org/vexi/value/Date.java branches/vexi3/org.vexi-library.value/src/test/java/org/vexi/value/TestDateTime.java Modified: branches/vexi3/org.vexi-library.js/src/main/java/org/ibex/js/JSU.java =================================================================== --- branches/vexi3/org.vexi-library.js/src/main/java/org/ibex/js/JSU.java 2014-10-24 20:00:14 UTC (rev 4740) +++ branches/vexi3/org.vexi-library.js/src/main/java/org/ibex/js/JSU.java 2014-10-28 08:32:22 UTC (rev 4741) @@ -329,6 +329,15 @@ if(isInt(js)) return toInt32(js); throw new JSExn("Arg "+index+" is not an integer: "+toString(js)); } + static public JSNumber expectArg_Number(JS[] args, int index) throws JSExn { + JS js = expectArg(args, index); + if(js!=null){ + JSNumber r = getNumber(js); + if(r != null) + return r; + } + throw new JSExn("Arg "+index+" is not a number: "+toString(js)); + } static public String getArg_string(JS[] args, int index) throws JSExn { JS js = getArg(args, index); if(js==null) return null; Modified: branches/vexi3/org.vexi-library.js/src/main/jpp/org/ibex/js/JSDate.jpp =================================================================== --- branches/vexi3/org.vexi-library.js/src/main/jpp/org/ibex/js/JSDate.jpp 2014-10-24 20:00:14 UTC (rev 4740) +++ branches/vexi3/org.vexi-library.js/src/main/jpp/org/ibex/js/JSDate.jpp 2014-10-28 08:32:22 UTC (rev 4741) @@ -87,10 +87,11 @@ JSDate a = expectDateOrNull(args,0); if(a==null) return null; String part = JSU.getArg_string(args, 1); - Integer amount = JSU.expectArg_Integer(args,2); + if(JSU.expectArg(args,2)==null) return null; + JSNumber amount = JSU.expectArg_Number(args,2); if(amount==null) return null; int partId = Date.partId(part); - return new JSDate(a.date.addPeriod(partId, amount)); + return new JSDate(a.date.addPeriod(partId, amount.toDouble())); case "cast": JSDate a = expectDateOrNull(args,0); if(a==null) return null; @@ -225,8 +226,8 @@ } case "addPeriod": { int partId = Date.partId(JSU.toString(JSU.expectArg(args,0))); - int amount = JSU.expectArg_int(args,1); - return new JSDate(date.addPeriod(partId, amount)); + JSNumber amount = JSU.expectArg_Number(args,1); + return new JSDate(date.addPeriod(partId, amount.toDouble())); } case "diff": { int partId = Date.partId(JSU.toString(JSU.expectArg(args,0))); Modified: branches/vexi3/org.vexi-library.value/src/main/java/org/vexi/value/Date.java =================================================================== --- branches/vexi3/org.vexi-library.value/src/main/java/org/vexi/value/Date.java 2014-10-24 20:00:14 UTC (rev 4740) +++ branches/vexi3/org.vexi-library.value/src/main/java/org/vexi/value/Date.java 2014-10-28 08:32:22 UTC (rev 4741) @@ -615,8 +615,30 @@ } - public Date addPeriod(int part, int amount) throws ValueException{ - if(!hasPart(part)) throw new ValueException("Cannot add "+partName(part)+" to "+ scheme.name); + public Date addPeriod(int part, double amount) throws ValueException{ + Calendar c = asCalendar(); + long delta; + switch (part) { + case PART_HOUR: +// if(((double)(int)amount*60)==amount*60){ +// return addPeriod(PART_MINUTE, (int)(amount*60)); +// } + delta = (long)(amount * D_MULTIPL_HOUR); + break; + case PART_MINUTE: + delta = (long)(amount * D_MULTIPL_MIN); + break; + default : + if(((double)(int)amount)==amount){ + return addPeriod(part, (int)amount); + } + throw new ValueException("Cannot add non-integer "+partName(part)+" to "+ scheme.name); + } + c.setTimeInMillis(c.getTimeInMillis() + delta); + return scheme.newDate(c); + } + + public Date addPeriod(int part, int amount) throws ValueException{ Calendar c = asCalendar(); switch(part){ case PART_MINUTE: @@ -641,13 +663,15 @@ c.add(Calendar.WEEK_OF_YEAR, amount); break; default: - throw new Error(); + throw new ValueException("Cannot add "+partName(part)+" to "+ scheme.name); } - - + return correct(c, part); + } + + private Date correct(Calendar c, int partStart) throws ValueException{ Date r = scheme.newDate(c); // check smaller parts as it is possible for these to drift (e.g. taking years from a week date) - for(int i = scheme.getPartIndex(part)+1; i<parts.length; i++){ + for(int i = scheme.getPartIndex(partStart)+1; i<parts.length; i++){ int diff = r.parts[i]-parts[i]; if(Math.abs(diff)==1){ // try adding value back on ..., sometimes not possible due to leap year @@ -659,6 +683,7 @@ } return r; } + public int diff(int part, Date from) throws ValueException{ int years = getPart(PART_YEAR)-from.getPart(PART_YEAR); switch(part){ @@ -712,6 +737,7 @@ + // UTILITY CODE static public long daysBetween(final Calendar startDate, final Calendar endDate) { if(startDate.after(endDate)){ return -daysBetween(endDate, startDate); @@ -735,5 +761,7 @@ return presumedDays; } + static final double D_MULTIPL_HOUR = 60 * 60 * 1000; + static final double D_MULTIPL_MIN = 60 * 1000; } Modified: branches/vexi3/org.vexi-library.value/src/test/java/org/vexi/value/TestDateTime.java =================================================================== --- branches/vexi3/org.vexi-library.value/src/test/java/org/vexi/value/TestDateTime.java 2014-10-24 20:00:14 UTC (rev 4740) +++ branches/vexi3/org.vexi-library.value/src/test/java/org/vexi/value/TestDateTime.java 2014-10-28 08:32:22 UTC (rev 4741) @@ -46,7 +46,8 @@ } public void testClockChangeIssue() throws ValueException{ - Date d1 = Date.tryParseString("2013-10-27 01:00").addPeriod(Date.PART_HOUR, -1); + Date d1 = Date.tryParseString("2013-10-27 01:00") + .addPeriod(Date.PART_HOUR, -1); assertEquals("2013-10-27 00:00",d1.format()); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. ------------------------------------------------------------------------------ _______________________________________________ Vexi-svn mailing list Vexi-svn@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/vexi-svn