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
[email protected]
https://lists.sourceforge.net/lists/listinfo/vexi-svn