EXSLT date normalization fix
authorJames Muscat <jrem@corefiling.com>
Tue, 4 Sep 2012 12:18:04 +0000 (20:18 +0800)
committerDaniel Veillard <veillard@redhat.com>
Tue, 4 Sep 2012 12:18:04 +0000 (20:18 +0800)
https://bugzilla.gnome.org/show_bug.cgi?id=626855

Dates with timezones but no time components are not normalized correctly
Using xsltproc v1.1.26:

$ xsltproc --version
Using libxml 20706, libxslt 10126 and libexslt 815
xsltproc was compiled against libxml 20704, libxslt 10126 and libexslt
815
libxslt 10126 was compiled against libxml 20704
libexslt 815 was compiled against libxml 20704

Dates that have timezone offsets specified but no time components, for
example
"1970-01-01+01:00", are not normalized correctly; the timezone part is
truncated:

date:seconds("1970-01-01") = 0
date:seconds("1970-01-01+01:00") = 0 (not -3600 as expected)

Alters the conditions under which exsltDateNormalize() returns
without normalizing, and adds test cases demonstrating the new behaviour.

libexslt/date.c
tests/exslt/date/seconds.1.out
tests/exslt/date/seconds.1.xml

index b692bb4..18523d0 100644 (file)
@@ -1602,7 +1602,7 @@ exsltDateNormalize (exsltDateValPtr dt)
     if (dt == NULL)
         return;
 
-    if (((dt->type & XS_TIME) != XS_TIME) || (dt->value.date.tzo == 0))
+    if (((dt->type & XS_TIME) != XS_TIME) && (dt->value.date.tzo == 0))
         return;
 
     dur = exsltDateCreateDate(XS_DURATION);
index 3447bf8..c0eb72c 100644 (file)
@@ -35,3 +35,19 @@ seconds : 0001-01-01T00:00:00
 result  : -6.21355968e+10
 seconds : -0001-01-01T00:00:00
 result  : -6.21671328e+10
+seconds : 1970-01-01
+result  : 0
+seconds : 1970-01-01Z
+result  : 0
+seconds : 1970-01-01-11:00
+result  : 39600
+seconds : 1970-01-01+11:00
+result  : -39600
+seconds : 1970-01-01-12:00
+result  : 43200
+seconds : 1970-01-01+12:00
+result  : -43200
+seconds : 1970-01-01-13:00
+result  : 46800
+seconds : 1970-01-01+13:00
+result  : -46800
index 5e0a664..24d58fb 100644 (file)
   <date duration="1971-01-01T00:00:00"/>
   <date duration="0001-01-01T00:00:00"/>
   <date duration="-0001-01-01T00:00:00"/>
+  <!-- timezones -->
+  <date duration="1970-01-01" />
+  <date duration="1970-01-01Z" />
+  <date duration="1970-01-01-11:00" />
+  <date duration="1970-01-01+11:00" />
+  <date duration="1970-01-01-12:00" />
+  <date duration="1970-01-01+12:00" />
+  <date duration="1970-01-01-13:00" />
+  <date duration="1970-01-01+13:00" />
 </page>