You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jena.apache.org by an...@apache.org on 2012/06/06 18:23:50 UTC

svn commit: r1346968 - in /jena/trunk/jena-core/src: main/java/com/hp/hpl/jena/datatypes/xsd/XSDDateTime.java test/java/com/hp/hpl/jena/graph/test/TestTypedLiterals.java

Author: andy
Date: Wed Jun  6 16:23:50 2012
New Revision: 1346968

URL: http://svn.apache.org/viewvc?rev=1346968&view=rev
Log:
JENA-247 (+ Java workaround).

Modified:
    jena/trunk/jena-core/src/main/java/com/hp/hpl/jena/datatypes/xsd/XSDDateTime.java
    jena/trunk/jena-core/src/test/java/com/hp/hpl/jena/graph/test/TestTypedLiterals.java

Modified: jena/trunk/jena-core/src/main/java/com/hp/hpl/jena/datatypes/xsd/XSDDateTime.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-core/src/main/java/com/hp/hpl/jena/datatypes/xsd/XSDDateTime.java?rev=1346968&r1=1346967&r2=1346968&view=diff
==============================================================================
--- jena/trunk/jena-core/src/main/java/com/hp/hpl/jena/datatypes/xsd/XSDDateTime.java (original)
+++ jena/trunk/jena-core/src/main/java/com/hp/hpl/jena/datatypes/xsd/XSDDateTime.java Wed Jun  6 16:23:50 2012
@@ -131,13 +131,23 @@ public class XSDDateTime extends Abstrac
     private static int[] convertCalendar(Calendar date) {
         int[] data = new int[TOTAL_SIZE];
 
-        int offset = date.get(Calendar.ZONE_OFFSET) + date.get(Calendar.DST_OFFSET);
-                                        //  Thanks to Greg Shueler for pointing out need for DST offset
-        Calendar cal = date;
-        if (offset != 0) {
-            cal = (Calendar)date.clone();
-            cal.add(Calendar.MILLISECOND, -offset);
-        }
+        // JENA-247
+        // code from jena 2.7.1 -- remove if you see this -- commented out, 
+        // not deleted just because it was close to a release and a pragmatic,
+        // Java bug (?) avoiding hack was used.  
+//        int offset = date.get(Calendar.ZONE_OFFSET) + date.get(Calendar.DST_OFFSET);
+//                                        //  Thanks to Greg Shueler for pointing out need for DST offset
+//        Calendar cal = date;
+//        if (offset != 0) {
+//            cal = (Calendar)date.clone();
+//            cal.add(Calendar.MILLISECOND, -offset);
+//        }
+        
+        Calendar cal = (Calendar)date.clone();
+        // By observation (Sun Java 6), this is necesary (to force internal calculations presumably) ...
+        cal.get(Calendar.ZONE_OFFSET) ;
+        // ... then we can rebase the calendar
+        cal.setTimeZone(TimeZone.getTimeZone("GMT")); 
         
         data[AbstractDateTime.CY] = cal.get(Calendar.YEAR);
         data[AbstractDateTime.M] = cal.get(Calendar.MONTH) + 1;

Modified: jena/trunk/jena-core/src/test/java/com/hp/hpl/jena/graph/test/TestTypedLiterals.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-core/src/test/java/com/hp/hpl/jena/graph/test/TestTypedLiterals.java?rev=1346968&r1=1346967&r2=1346968&view=diff
==============================================================================
--- jena/trunk/jena-core/src/test/java/com/hp/hpl/jena/graph/test/TestTypedLiterals.java (original)
+++ jena/trunk/jena-core/src/test/java/com/hp/hpl/jena/graph/test/TestTypedLiterals.java Wed Jun  6 16:23:50 2012
@@ -21,11 +21,13 @@ package com.hp.hpl.jena.graph.test;
 import java.io.* ;
 import java.math.BigDecimal ;
 import java.math.BigInteger ;
+import java.text.SimpleDateFormat ;
 import java.util.* ;
 
 import junit.framework.TestCase ;
 import junit.framework.TestSuite ;
 import org.apache.xerces.impl.dv.util.HexBin ;
+import org.junit.Assert ;
 
 import com.hp.hpl.jena.datatypes.BaseDatatype ;
 import com.hp.hpl.jena.datatypes.DatatypeFormatException ;
@@ -1023,6 +1025,82 @@ public class TestTypedLiterals extends T
         checkSerialization("---12", XSDDatatype.XSDgDay);
     }
     
+    private static Date getDateFromPattern(String ts, String format, String timezoneid) throws Exception {
+        return getDateFromPattern(ts, new String[]{format}, TimeZone.getTimeZone(timezoneid));
+    }
+
+    private static Date getDateFromPattern(String ts, String[] formats, TimeZone tz) throws Exception {
+        java.util.Date date = null;
+        java.text.DateFormat sdf = java.text.DateFormat.getInstance();
+        {
+            sdf.setTimeZone(tz == null ? java.util.TimeZone.getDefault() : tz);
+            for (int i=0; date == null && i<formats.length;i++){
+                ((java.text.SimpleDateFormat)sdf).applyPattern(formats[i]);
+                try {
+                    date = sdf.parse(ts);
+                } catch (java.text.ParseException pe){} // keep trying
+            }
+        }
+        return date;
+    }
+    
+    public void testDateTimeBug2() throws Exception {
+        String[] timezonelist = {
+            "GMT",
+            "America/New_York",
+            "America/Chicago",
+        };
+
+        for (String timezoneid : timezonelist) {
+            TimeZone tz = TimeZone.getTimeZone(timezoneid);
+            String[] sampletimelist = {
+                "03/10/2012 01:29", 
+                // 03/11/2012 DST time change at 2 am
+                "03/11/2012 00:29",
+                "03/11/2012 01:29",
+                "03/11/2012 02:29",
+                "03/11/2012 03:29",
+                "03/11/2012 04:29",
+
+                "03/12/2012 01:29",
+                "11/03/2012 23:29",
+                // 11/04/2012 standard time change at 2 am
+                "11/04/2012 00:29",
+                "11/04/2012 01:29",
+                "11/04/2012 02:29",
+                "11/04/2012 03:29",
+            };
+
+
+
+            String format = "MM/dd/yyy HH:mm";
+            for (String tstr : sampletimelist){
+                Date dt=getDateFromPattern(tstr, format, timezoneid);
+                SimpleDateFormat df = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss z");
+                df.setTimeZone(tz);
+                Calendar cal = Calendar.getInstance();
+                cal.setTimeZone(tz);
+                cal.setTime(dt);
+                XSDDateTime xdt = new XSDDateTime(cal);
+                int offset = tz.getOffset(dt.getTime()) /( 60 * 60 * 1000);
+                int xhr = xdt.getHours();
+                int dhr = cal.get(Calendar.HOUR_OF_DAY);
+                int dif = (xhr -dhr + offset) % 24;
+                Assert.assertEquals("Difference between cal and xdt", 0, dif) ;
+                
+//                //System.out.println("xhr="+xhr+",dhr="+dhr+",dif="+dif);
+//                System.out.println(""
+//                    +"tstr="+tstr
+//                    +"\tdate="+df.format(dt)
+//                    +(dif==0?"\t ":"\tX")
+//                    +" xsddt="+xdt
+//                    +"\toffset="+offset);
+            }
+            //System.out.println();
+        }
+    }
+    
+    
     /**
      * Test global parameter flags.
      */