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

Reply via email to