Revision: 4563 http://sourceforge.net/p/vexi/code/4563 Author: mkpg2 Date: 2013-10-10 16:00:16 +0000 (Thu, 10 Oct 2013) Log Message: ----------- Date. Support 'date-times'. Added hours & minutes support to the date object.
Modified Paths: -------------- 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/JSInstant.jpp 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/Instant.java Added Paths: ----------- branches/vexi3/org.vexi-library.value/src/test/java/org/vexi/value/TestDateTime.java 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 2013-10-10 13:22:06 UTC (rev 4562) +++ branches/vexi3/org.vexi-library.js/src/main/jpp/org/ibex/js/JSDate.jpp 2013-10-10 16:00:16 UTC (rev 4563) @@ -168,8 +168,8 @@ * @type(Number) */ case "day": return getPartJS(key); case "weekday": return getPartJS(key); - case "hours": throw new JSExn("Unsupported: "+key); - case "minutes": throw new JSExn("Unsupported: "+key); + case "hours": return getPartJS(key); + case "minutes": return getPartJS(key); case "seconds": throw new JSExn("Unsupported: "+key); case "scheme": return JSU.S(date.getScheme().name); Modified: branches/vexi3/org.vexi-library.js/src/main/jpp/org/ibex/js/JSInstant.jpp =================================================================== --- branches/vexi3/org.vexi-library.js/src/main/jpp/org/ibex/js/JSInstant.jpp 2013-10-10 13:22:06 UTC (rev 4562) +++ branches/vexi3/org.vexi-library.js/src/main/jpp/org/ibex/js/JSInstant.jpp 2013-10-10 16:00:16 UTC (rev 4563) @@ -8,6 +8,7 @@ import org.vexi.value.Date; import org.vexi.value.Instant; +import org.vexi.value.ValueException; /** * <p>Represents a point in time. Programmatically, when dealing with time as @@ -35,7 +36,7 @@ } static private TimeZone expectTimeZone(JS[] args, int i){ - if(args.length<=i){ + if(args.length<=i || args[i]==null){ return getTimeZone(); } return expectTimeZone(args[i]); @@ -127,27 +128,42 @@ } public JS callMethod(JS this_, JS method, JS[] args) throws JSExn { - //#switch(JSU.toString(method)) - case "format": { - TimeZone timezone = expectTimeZone(args,0); - return JSU.S(instant.format(timezone)); - } - case "getDate": { - TimeZone timezone = expectTimeZone(args,0); - return new JSDate(instant.getDate(timezone)); + try{ + //#switch(JSU.toString(method)) + case "format": { + TimeZone timezone = expectTimeZone(args,0); + return JSU.S(instant.format(timezone)); + } + case "getDate": { + TimeZone timezone = expectTimeZone(args,0); + Date.Scheme scheme; + if(args.length>=2){ + String schemeStr = JSU.expectArg_string(args,1); + scheme = Date.getScheme(schemeStr); + }else{ + scheme = Date.SCHEME_YMD; + } + return new JSDate(instant.getDate(timezone, scheme)); + } + case "getDateTime": { + TimeZone timezone = expectTimeZone(args,0); + return new JSDate(instant.getDate(timezone, Date.SCHEME_YMDHM)); + } + case "getTime": { + TimeZone timezone = expectTimeZone(args,0); + return JSU.S(instant.getTime(timezone)); + } + case "diffMillis": return diffMillis(args); + case "diff": return diffMillis(args); + case "addMillis": { + int amount = JSU.expectArg_int(args,0); + return new JSInstant(instant.millis()+amount); + } + //#end + return super.callMethod(this_, method, args); + }catch(ValueException e){ + throw new JSExn(e.getMessage()); } - case "getTime": { - TimeZone timezone = expectTimeZone(args,0); - return JSU.S(instant.getTime(timezone)); - } - case "diffMillis": return diffMillis(args); - case "diff": return diffMillis(args); - case "addMillis": { - int amount = JSU.expectArg_int(args,0); - return new JSInstant(instant.millis()+amount); - } - //#end - return super.callMethod(this_, method, args); } public int hashCode(){ return instant.hashCode(); } 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 2013-10-10 13:22:06 UTC (rev 4562) +++ branches/vexi3/org.vexi-library.value/src/main/java/org/vexi/value/Date.java 2013-10-10 16:00:16 UTC (rev 4563) @@ -41,6 +41,8 @@ static public Date newY(int y){ return new Date(SCHEME_Y, new int[]{y}); } static public Date newYM(int y, int m){ return new Date(SCHEME_YM, new int[]{y, m}); } static public Date newYMD(int y, int m, int d){ return new Date(SCHEME_YMD, new int[]{y, m, d}); } + static public Date newYMDH(int y, int m, int d, int h){ return new Date(SCHEME_YMDH, new int[]{y, m, d, h}); } + static public Date newYMDHM(int y, int m, int d, int h, int mi){ return new Date(SCHEME_YMDHM, new int[]{y, m, d, h, mi}); } static public Date newYQ(int y, int q){ return new Date(SCHEME_YQ, new int[]{y, q}); } static public Date newDate(String schemeStr, int[] parts) throws ValueException{ @@ -53,12 +55,18 @@ PART_YEAR = 0, PART_MONTH = -1, PART_DAY = -2, - PART_QUARTER = -3, - PART_WEEKDAY = -4; + PART_HOUR = -3, + PART_MINUTE = -4, + + PART_QUARTER = -5, + PART_WEEKDAY = -6; static public int partId(String partName) throws ValueException{ if("year".equals(partName)) return PART_YEAR; if("month".equals(partName)) return PART_MONTH; if("day".equals(partName)) return PART_DAY; + if("hour".equals(partName)) return PART_HOUR; + if("minute".equals(partName)) return PART_MINUTE; + if("quarter".equals(partName)) return PART_QUARTER; if("weekday".equals(partName)) return PART_WEEKDAY; throw new ValueException("No such part: "+partName); @@ -68,6 +76,8 @@ case PART_YEAR: return "year"; case PART_MONTH: return "month"; case PART_DAY: return "day"; + case PART_HOUR: return "hour"; + case PART_MINUTE: return "minute"; case PART_QUARTER: return "quarter"; case PART_WEEKDAY: return "weekday"; } @@ -78,6 +88,8 @@ case PART_YEAR: return cal.get(Calendar.YEAR); case PART_MONTH: return cal.get(Calendar.MONTH)+1; case PART_DAY: return cal.get(Calendar.DAY_OF_MONTH); + case PART_HOUR: return cal.get(Calendar.HOUR_OF_DAY); + case PART_MINUTE: return cal.get(Calendar.MINUTE); case PART_QUARTER: return (cal.get(Calendar.MONTH)/3)+1; case PART_WEEKDAY: return cal.get(Calendar.DAY_OF_WEEK); } @@ -87,6 +99,10 @@ static private boolean partValid(int partId, int value) throws ValueException { switch(partId){ + case PART_MINUTE: + return (value>=0 && value<60); + case PART_HOUR: + return (value>=0 && value<23); case PART_DAY: // HACK should check based on month return (value>=1 && value<=31); @@ -165,6 +181,8 @@ static final public Scheme SCHEME_Y = new Scheme("Y", new int[]{PART_YEAR}); static final public Scheme SCHEME_YM = new Scheme("YM", new int[]{PART_YEAR, PART_MONTH}); static final public Scheme SCHEME_YMD = new Scheme("YMD", new int[]{PART_YEAR, PART_MONTH, PART_DAY}); + static final public Scheme SCHEME_YMDH = new Scheme("YMDHM", new int[]{PART_YEAR, PART_MONTH, PART_DAY, PART_HOUR}); + static final public Scheme SCHEME_YMDHM = new Scheme("YMDHM", new int[]{PART_YEAR, PART_MONTH, PART_DAY, PART_HOUR, PART_MINUTE}); static final public Scheme SCHEME_YQ = new Scheme("YQ", new int[]{PART_YEAR, PART_QUARTER}); @@ -172,6 +190,8 @@ SCHEME_Y, SCHEME_YM, SCHEME_YMD, + SCHEME_YMDH, + SCHEME_YMDHM, SCHEME_YQ }; @@ -199,7 +219,7 @@ // - static Pattern p = Pattern.compile("([0-9]{1,4})([q-])?([0-9]{1,2})?(-([0-9]{1,2}))?"); + static Pattern p = Pattern.compile("([0-9]{1,4})([q-])?([0-9]{1,2})?(-([0-9]{1,2})( ([0-9]{1,2})(:([0-9]{1,2}))?)?)?"); static public Date parseString(String s) throws ValueException{ Date r = tryParseString(s); if(r==null) throw new ValueException("No a date '" + s + "'"); @@ -228,7 +248,20 @@ return newYM(year, month); }else{ int day = Integer.parseInt(dayStr); - return newYMD(year, month, day); + String hrStr = m.group(7); + if(hrStr==null){ + return newYMD(year, month, day); + }else{ + int hr = Integer.parseInt(hrStr); + String miStr = m.group(9); + + if(miStr==null){ + return newYMDH(year, month, day, hr); + }else{ + int mi = Integer.parseInt(miStr); + return newYMDHM(year, month, day, hr, mi); + } + } } }else{ throw new Error(s); @@ -249,6 +282,13 @@ int day = expectPart(PART_DAY); return year+"-"+padZero(month)+"-"+padZero(day); } + if(scheme==SCHEME_YMDHM || scheme==SCHEME_YMDH){ + int month = expectPart(PART_MONTH); + int day = expectPart(PART_DAY); + int hour = expectPart(PART_HOUR); + int minute = getPartDefault(PART_MINUTE); + return year+"-"+padZero(month)+"-"+padZero(day)+" "+padZero(hour)+":"+padZero(minute); + } if(scheme==SCHEME_YQ){ int quarter = expectPart(PART_QUARTER); return year+"q"+quarter; @@ -297,6 +337,8 @@ public int getPartDefault(int part){ if (hasPart(part)) return expectPart(part); switch(part){ + case PART_MINUTE: + case PART_HOUR: return 0; case PART_DAY: return 1; case PART_MONTH: if(hasPart(PART_QUARTER)){ @@ -329,11 +371,13 @@ private GregorianCalendar asCalendar() { - return new GregorianCalendar( + return new GregorianCalendar( getPartDefault(PART_YEAR), getPartDefault(PART_MONTH)-1, - getPartDefault(PART_DAY) - ); + getPartDefault(PART_DAY), + getPartDefault(PART_HOUR), + getPartDefault(PART_MINUTE) + ); } public Instant asInstant() throws ValueException { return asInstant(null); } public Instant asInstant(String timezone) throws ValueException { @@ -351,6 +395,30 @@ return scheme2.newDate(asCalendar()); } + private Scheme getSchemeForPart(int partId){ + switch(partId){ + case PART_YEAR: return SCHEME_Y; + case PART_MONTH: return SCHEME_YM; + case PART_DAY: return SCHEME_YMD; + case PART_HOUR: return SCHEME_YMDH; + case PART_MINUTE: return SCHEME_YMDHM; + case PART_QUARTER: return SCHEME_YQ; + } + return null; + } + + + private int getSuperiorPart(int partId){ + switch(partId){ + case PART_QUARTER: + case PART_MONTH: return PART_YEAR; + case PART_DAY: return PART_MONTH; + case PART_HOUR: return PART_DAY; + case PART_MINUTE: return PART_HOUR; + } + throw new Error(); + } + public Date with(int part, int value) throws ValueException { if(hasPart(part)){ int[] r = new int[parts.length]; @@ -358,13 +426,14 @@ scheme.setPart(part, r, value); return scheme.newDate(r); }else{ - int year = expectPart(PART_YEAR); - if(SCHEME_Y==scheme){ - if(part==PART_MONTH) return newYM(year, value); - if(part==PART_QUARTER) return newYQ(year, value); - }else if(SCHEME_YM==scheme){ - if(part==PART_DAY) return newYMD(year, expectPart(PART_MONTH), value); - } + // appending a part - changes the scheme + if(hasPart(getSuperiorPart(part))){ + Scheme scheme1 = getSchemeForPart(part); + int[] r = new int[parts.length+1]; + System.arraycopy(parts, 0, r, 0, parts.length); + scheme1.setPart(part, r, value); + return scheme1.newDate(r); + } } throw new ValueException("Cannot derive "+scheme.name+" with date part "+partName(part)); } @@ -374,6 +443,12 @@ if(!hasPart(part)) throw new ValueException("Cannot add "+partName(part)+" to "+ scheme.name); Calendar c = asCalendar(); switch(part){ + case PART_MINUTE: + c.add(Calendar.MINUTE, amount); + break; + case PART_HOUR: + c.add(Calendar.HOUR_OF_DAY, amount); + break; case PART_YEAR: c.add(Calendar.YEAR, amount); break; Modified: branches/vexi3/org.vexi-library.value/src/main/java/org/vexi/value/Instant.java =================================================================== --- branches/vexi3/org.vexi-library.value/src/main/java/org/vexi/value/Instant.java 2013-10-10 13:22:06 UTC (rev 4562) +++ branches/vexi3/org.vexi-library.value/src/main/java/org/vexi/value/Instant.java 2013-10-10 16:00:16 UTC (rev 4563) @@ -105,9 +105,10 @@ cal.setTimeInMillis(value); return cal; } - - public Date getDate(TimeZone timezone) { - return Date.SCHEME_YMD.newDate(asCalendar(timezone)); + + public Date getDate(TimeZone timezone) { return getDate(timezone, Date.SCHEME_YMD); } + public Date getDate(TimeZone timezone, Date.Scheme scheme) { + return scheme.newDate(asCalendar(timezone)); } public String getTime(TimeZone timezone) { Added: 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 (rev 0) +++ branches/vexi3/org.vexi-library.value/src/test/java/org/vexi/value/TestDateTime.java 2013-10-10 16:00:16 UTC (rev 4563) @@ -0,0 +1,56 @@ +package org.vexi.value; + +import junit.framework.TestCase; + + +public class TestDateTime extends TestCase{ + + static void assertParse(String s) throws ValueException{ assertParse(s, s); } + static void assertParse(String s, String expected) throws ValueException{ + Date d = Date.parseString(s); + assertEquals(expected, d.format()); + } + + public void testParse() throws ValueException { + assertParse("2004-4-3 23:59","2004-04-03 23:59"); + assertParse("2004-4-3 00:00","2004-04-03 00:00"); + } + + + public void testWithAndAs() throws ValueException { + Date d = Date.newYMD(2013,10,10); + assertEquals("2013-10-10", d.as(Date.SCHEME_YMD).format()); + assertEquals("2013-10-10 00:00", d.as(Date.SCHEME_YMDH).format()); + assertEquals("2013-10-10 00:00", d.as(Date.SCHEME_YMDHM).format()); + + Date dh = d.with(Date.PART_HOUR, 13); + assertEquals("2013-10-10 13:00", dh.format()); + assertEquals("2013-10-10 13:25", dh.with(Date.PART_MINUTE, 25).format()); + } + + public void testAdd() throws ValueException { + Date dt = Date.newYMDHM(2013,10,10,16,29); + + assertEquals("2013-10-12 16:29", dt.addPeriod(Date.PART_DAY, 2).format()); + assertEquals("2013-10-11 05:29", dt.addPeriod(Date.PART_HOUR, 13).format()); + assertEquals("2013-10-10 17:05", dt.addPeriod(Date.PART_MINUTE, 36).format()); + } + + public void testCompare() throws ValueException { + Date d0 = Date.newYMDHM(2013,10,10,16,29); + Date d1 = Date.newYMDHM(2013,10,10,16,33); + + assertEquals(0,d0.compareTo(d0)); + assertTrue(d0.compareTo(d1)<0); + assertTrue(d1.compareTo(d0)>0); + } +// +// public void testDiff() throws ValueException { +// assertEquals(30, Date.newY(2011).diff(Date.PART_YEAR, Date.newY(1981))); +// assertEquals(50, Date.newYM(2011,11).diff(Date.PART_MONTH, Date.newYM(2007, 9))); +// assertEquals(22, Date.newYQ(2008,1).diff(Date.PART_QUARTER, Date.newYQ(2002, 3))); +// } +// + +// +} Property changes on: branches/vexi3/org.vexi-library.value/src/test/java/org/vexi/value/TestDateTime.java ___________________________________________________________________ Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. ------------------------------------------------------------------------------ October Webinars: Code for Performance Free Intel webinars can help you accelerate application performance. Explore tips for MPI, OpenMP, advanced profiling, and more. Get the most from the latest Intel processors and coprocessors. See abstracts and register > http://pubads.g.doubleclick.net/gampad/clk?id=60134071&iu=/4140/ostg.clktrk _______________________________________________ Vexi-svn mailing list Vexi-svn@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/vexi-svn