On 04/06/12 14:29, Spates, Rick wrote:
Andy,

Have you had a chance to look at this any further?  Assuming the need
for a fix is validated I was hoping to get it into a release of our
clinical application before the Fall.

Thanks,
Rick

It's recorded as JENA-247 [1].

It's not an area of the system I'm particularly familiar with and the forcing to a particular timezone (other than I think GMT should be UTC - up to a second different!) is presumably because of how Xerces internally records date/times. My caution is because fixing one thing must not unfix something else.

I hope to get it into the release we're currently working, either by finding a chunk of time to understand that part of the system or by sync'ing up with someone who does.

        Andy

[1] https://issues.apache.org/jira/browse/JENA-247


-----Original Message-----
From: Andy Seaborne [mailto:[email protected]] On Behalf Of
Andy Seaborne
Sent: Monday, May 14, 2012 5:09 PM
To: [email protected]
Subject: Re: XSDDateTime issue

Rick,

Thanks for the example - I have managed to construct your code from the
email and will investigate further.

        Andy


On 14/05/12 02:45, Spates, Rick wrote:


The XSDDateTime constructor creates a datetime object which can be
incorrect depending on the timezone and proximity to either a daylight
savings or standard time change.



Below is a mix of datetimes around the Spring and Fall time changes in
different time zones.  I'm using Jena 2.6.4 but the XSDDateTime class
appears little changed in 2.7.0.  In these results, tstr is an input
string, date is a formatted Date, xsddt is the XSDDateTime instance
and
'X' means the xsddt is incorrect:



tstr=03/10/2012 01:29 date=2012.03.10 01:29:00 GMT
xsddt=2012-03-10T01:29:00Z     offset=0

tstr=03/11/2012 00:29 date=2012.03.11 00:29:00 GMT
xsddt=2012-03-11T00:29:00Z     offset=0

tstr=03/11/2012 01:29 date=2012.03.11 01:29:00 GMT
xsddt=2012-03-11T01:29:00Z     offset=0

tstr=03/11/2012 02:29 date=2012.03.11 02:29:00 GMT
xsddt=2012-03-11T02:29:00Z     offset=0

tstr=03/11/2012 03:29 date=2012.03.11 03:29:00 GMT
xsddt=2012-03-11T03:29:00Z     offset=0

tstr=03/11/2012 04:29 date=2012.03.11 04:29:00 GMT
xsddt=2012-03-11T04:29:00Z     offset=0

tstr=03/12/2012 01:29 date=2012.03.12 01:29:00 GMT
xsddt=2012-03-12T01:29:00Z     offset=0

tstr=11/03/2012 23:29 date=2012.11.03 23:29:00 GMT
xsddt=2012-11-03T23:29:00Z     offset=0

tstr=11/04/2012 00:29 date=2012.11.04 00:29:00 GMT
xsddt=2012-11-04T00:29:00Z     offset=0

tstr=11/04/2012 01:29 date=2012.11.04 01:29:00 GMT
xsddt=2012-11-04T01:29:00Z     offset=0

tstr=11/04/2012 02:29 date=2012.11.04 02:29:00 GMT
xsddt=2012-11-04T02:29:00Z     offset=0

tstr=11/04/2012 03:29 date=2012.11.04 03:29:00 GMT
xsddt=2012-11-04T03:29:00Z     offset=0



tstr=03/10/2012 01:29 date=2012.03.10 01:29:00 EST
xsddt=2012-03-10T06:29:00Z     offset=-5

tstr=03/11/2012 00:29 date=2012.03.11 00:29:00 EST    X
xsddt=2012-03-11T06:29:00Z     offset=-5

tstr=03/11/2012 01:29 date=2012.03.11 01:29:00 EST    X
xsddt=2012-03-11T07:29:00Z     offset=-5

tstr=03/11/2012 02:29 date=2012.03.11 03:29:00 EDT
xsddt=2012-03-11T07:29:00Z     offset=-4

tstr=03/11/2012 03:29 date=2012.03.11 03:29:00 EDT
xsddt=2012-03-11T07:29:00Z     offset=-4

tstr=03/11/2012 04:29 date=2012.03.11 04:29:00 EDT
xsddt=2012-03-11T08:29:00Z     offset=-4

tstr=03/12/2012 01:29 date=2012.03.12 01:29:00 EDT
xsddt=2012-03-12T05:29:00Z     offset=-4

tstr=11/03/2012 23:29 date=2012.11.03 23:29:00 EDT    X
xsddt=2012-11-04T02:29:00Z     offset=-4

tstr=11/04/2012 00:29 date=2012.11.04 00:29:00 EDT    X
xsddt=2012-11-04T03:29:00Z     offset=-4

tstr=11/04/2012 01:29 date=2012.11.04 01:29:00 EST
xsddt=2012-11-04T06:29:00Z     offset=-5

tstr=11/04/2012 02:29 date=2012.11.04 02:29:00 EST
xsddt=2012-11-04T07:29:00Z     offset=-5

tstr=11/04/2012 03:29 date=2012.11.04 03:29:00 EST
xsddt=2012-11-04T08:29:00Z     offset=-5



tstr=03/10/2012 01:29 date=2012.03.10 01:29:00 CST
xsddt=2012-03-10T07:29:00Z     offset=-6

tstr=03/11/2012 00:29 date=2012.03.11 00:29:00 CST    X
xsddt=2012-03-11T07:29:00Z     offset=-6

tstr=03/11/2012 01:29 date=2012.03.11 01:29:00 CST    X
xsddt=2012-03-11T08:29:00Z     offset=-6

tstr=03/11/2012 02:29 date=2012.03.11 03:29:00 CDT
xsddt=2012-03-11T08:29:00Z     offset=-5

tstr=03/11/2012 03:29 date=2012.03.11 03:29:00 CDT
xsddt=2012-03-11T08:29:00Z     offset=-5

tstr=03/11/2012 04:29 date=2012.03.11 04:29:00 CDT
xsddt=2012-03-11T09:29:00Z     offset=-5

tstr=03/12/2012 01:29 date=2012.03.12 01:29:00 CDT
xsddt=2012-03-12T06:29:00Z     offset=-5

tstr=11/03/2012 23:29 date=2012.11.03 23:29:00 CDT    X
xsddt=2012-11-04T03:29:00Z     offset=-5

tstr=11/04/2012 00:29 date=2012.11.04 00:29:00 CDT    X
xsddt=2012-11-04T04:29:00Z     offset=-5

tstr=11/04/2012 01:29 date=2012.11.04 01:29:00 CST
xsddt=2012-11-04T07:29:00Z     offset=-6

tstr=11/04/2012 02:29 date=2012.11.04 02:29:00 CST
xsddt=2012-11-04T08:29:00Z     offset=-6

tstr=11/04/2012 03:29 date=2012.11.04 03:29:00 CST
xsddt=2012-11-04T09:29:00Z     offset=-6





The XSDDateTime convertCalendar(Calendar date) method, called by
XSDDateTime(Calendar date), can be changed to produce correct results
by
replacing:



                       cal.add(Calendar.MILLISECOND, -offset);



with:



                       cal.setTimeZone(TimeZone.getTimeZone("GMT"));





Here are the test results with the suggested code replacement--no
incorrect results:



tstr=03/10/2012 01:29 date=2012.03.10 01:29:00 GMT
xsddt=2012-03-10T01:29:00Z     offset=0

tstr=03/11/2012 00:29 date=2012.03.11 00:29:00 GMT
xsddt=2012-03-11T00:29:00Z     offset=0

tstr=03/11/2012 01:29 date=2012.03.11 01:29:00 GMT
xsddt=2012-03-11T01:29:00Z     offset=0

tstr=03/11/2012 02:29 date=2012.03.11 02:29:00 GMT
xsddt=2012-03-11T02:29:00Z     offset=0

tstr=03/11/2012 03:29 date=2012.03.11 03:29:00 GMT
xsddt=2012-03-11T03:29:00Z     offset=0

tstr=03/11/2012 04:29 date=2012.03.11 04:29:00 GMT
xsddt=2012-03-11T04:29:00Z     offset=0

tstr=03/12/2012 01:29 date=2012.03.12 01:29:00 GMT
xsddt=2012-03-12T01:29:00Z     offset=0

tstr=11/03/2012 23:29 date=2012.11.03 23:29:00 GMT
xsddt=2012-11-03T23:29:00Z     offset=0

tstr=11/04/2012 00:29 date=2012.11.04 00:29:00 GMT
xsddt=2012-11-04T00:29:00Z     offset=0

tstr=11/04/2012 01:29 date=2012.11.04 01:29:00 GMT
xsddt=2012-11-04T01:29:00Z     offset=0

tstr=11/04/2012 02:29 date=2012.11.04 02:29:00 GMT
xsddt=2012-11-04T02:29:00Z     offset=0

tstr=11/04/2012 03:29 date=2012.11.04 03:29:00 GMT
xsddt=2012-11-04T03:29:00Z     offset=0



tstr=03/10/2012 01:29 date=2012.03.10 01:29:00 EST
xsddt=2012-03-10T06:29:00Z     offset=-5

tstr=03/11/2012 00:29 date=2012.03.11 00:29:00 EST
xsddt=2012-03-11T05:29:00Z     offset=-5

tstr=03/11/2012 01:29 date=2012.03.11 01:29:00 EST
xsddt=2012-03-11T06:29:00Z     offset=-5

tstr=03/11/2012 02:29 date=2012.03.11 03:29:00 EDT
xsddt=2012-03-11T07:29:00Z     offset=-4

tstr=03/11/2012 03:29 date=2012.03.11 03:29:00 EDT
xsddt=2012-03-11T07:29:00Z     offset=-4

tstr=03/11/2012 04:29 date=2012.03.11 04:29:00 EDT
xsddt=2012-03-11T08:29:00Z     offset=-4

tstr=03/12/2012 01:29 date=2012.03.12 01:29:00 EDT
xsddt=2012-03-12T05:29:00Z     offset=-4

tstr=11/03/2012 23:29 date=2012.11.03 23:29:00 EDT
xsddt=2012-11-04T03:29:00Z     offset=-4

tstr=11/04/2012 00:29 date=2012.11.04 00:29:00 EDT
xsddt=2012-11-04T04:29:00Z     offset=-4

tstr=11/04/2012 01:29 date=2012.11.04 01:29:00 EST
xsddt=2012-11-04T06:29:00Z     offset=-5

tstr=11/04/2012 02:29 date=2012.11.04 02:29:00 EST
xsddt=2012-11-04T07:29:00Z     offset=-5

tstr=11/04/2012 03:29 date=2012.11.04 03:29:00 EST
xsddt=2012-11-04T08:29:00Z     offset=-5



tstr=03/10/2012 01:29 date=2012.03.10 01:29:00 CST
xsddt=2012-03-10T07:29:00Z     offset=-6

tstr=03/11/2012 00:29 date=2012.03.11 00:29:00 CST
xsddt=2012-03-11T06:29:00Z     offset=-6

tstr=03/11/2012 01:29 date=2012.03.11 01:29:00 CST
xsddt=2012-03-11T07:29:00Z     offset=-6

tstr=03/11/2012 02:29 date=2012.03.11 03:29:00 CDT
xsddt=2012-03-11T08:29:00Z     offset=-5

tstr=03/11/2012 03:29 date=2012.03.11 03:29:00 CDT
xsddt=2012-03-11T08:29:00Z     offset=-5

tstr=03/11/2012 04:29 date=2012.03.11 04:29:00 CDT
xsddt=2012-03-11T09:29:00Z     offset=-5

tstr=03/12/2012 01:29 date=2012.03.12 01:29:00 CDT
xsddt=2012-03-12T06:29:00Z     offset=-5

tstr=11/03/2012 23:29 date=2012.11.03 23:29:00 CDT
xsddt=2012-11-04T04:29:00Z     offset=-5

tstr=11/04/2012 00:29 date=2012.11.04 00:29:00 CDT
xsddt=2012-11-04T05:29:00Z     offset=-5

tstr=11/04/2012 01:29 date=2012.11.04 01:29:00 CST
xsddt=2012-11-04T07:29:00Z     offset=-6

tstr=11/04/2012 02:29 date=2012.11.04 02:29:00 CST
xsddt=2012-11-04T08:29:00Z     offset=-6

tstr=11/04/2012 03:29 date=2012.11.04 03:29:00 CST
xsddt=2012-11-04T09:29:00Z     offset=-6





Can somebody verify these results?





Thanks,

Rick





The test code:





package test;





import java.text.SimpleDateFormat;

import java.util.Calendar;

import java.util.Date;

import java.util.TimeZone;



import org.junit.Test;



import com.hp.hpl.jena.datatypes.xsd.XSDDateTime;



public class TestXSDDateTime {



       public static Date getDateFromPattern(String ts, String format,
String timezoneid) throws Exception {

             return getDateFromPattern(ts, new String[]{format},
TimeZone.getTimeZone(timezoneid));

       }

       public 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;

       }



       @Test

       public void test() 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;


//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();

             }

       }

}










Reply via email to