[libxslt] Fix date:difference with time zones



commit b461532403e55cf56b601537b2556a23e106bee4
Author: Nick Wellnhofer <wellnhofer aevum de>
Date:   Thu May 18 01:08:03 2017 +0200

    Fix date:difference with time zones
    
    With time zones, the time difference can be more than two days,
    requiring a modulo operation.

 libexslt/date.c                   |   12 +++++++++---
 tests/exslt/date/difference.1.out |    6 +++++-
 tests/exslt/date/difference.1.xml |    2 ++
 3 files changed, 16 insertions(+), 4 deletions(-)
---
diff --git a/libexslt/date.c b/libexslt/date.c
index 702f2f9..ee92b6a 100644
--- a/libexslt/date.c
+++ b/libexslt/date.c
@@ -1658,12 +1658,18 @@ _exsltDateDifference (exsltDateValPtr x, exsltDateValPtr y, int flag)
        /* The above will give a wrong result if x and y are on different sides
         of the September 1752. Resolution is welcome :-) */
     } else {
-        ret->value.dur.day  = _exsltDateCastYMToDays(y) -
-                              _exsltDateCastYMToDays(x);
-        ret->value.dur.day += y->value.date.day - x->value.date.day;
+        long carry;
         ret->value.dur.sec  = TIME_TO_NUMBER(y) - TIME_TO_NUMBER(x);
         ret->value.dur.sec += (x->value.date.tzo - y->value.date.tzo) *
                               SECS_PER_MIN;
+        carry = (long)(ret->value.dur.sec / SECS_PER_DAY);
+        ret->value.dur.sec = fmod(ret->value.dur.sec, SECS_PER_DAY);
+
+        ret->value.dur.day  = _exsltDateCastYMToDays(y) -
+                              _exsltDateCastYMToDays(x);
+        ret->value.dur.day += y->value.date.day - x->value.date.day;
+        ret->value.dur.day += carry;
+
        if (ret->value.dur.day > 0.0 && ret->value.dur.sec < 0.0) {
            ret->value.dur.day -= 1;
            ret->value.dur.sec = ret->value.dur.sec + SECS_PER_DAY;
diff --git a/tests/exslt/date/difference.1.out b/tests/exslt/date/difference.1.out
index aac2e14..0329e15 100644
--- a/tests/exslt/date/difference.1.out
+++ b/tests/exslt/date/difference.1.out
@@ -36,4 +36,8 @@ result     : -PT2S
 difference : 2000-01-02T05:00:03 - 2000-01-01T04:03:02
 result     : -P1DT57M1S
 difference : 2016-04-28T17:59:30+02:00 - 2016-04-28T17:59:30+04:00
-result     : -PT2H
\ No newline at end of file
+result     : -PT2H
+difference : 2000-01-05T01:00:00+11:00 - 2000-01-01T23:00:00-11:00
+result     : -P2DT4H
+difference : 2000-01-01T23:00:00-11:00 - 2000-01-05T01:00:00+11:00
+result     : P2DT4H
\ No newline at end of file
diff --git a/tests/exslt/date/difference.1.xml b/tests/exslt/date/difference.1.xml
index 0e361f0..cfc4759 100644
--- a/tests/exslt/date/difference.1.xml
+++ b/tests/exslt/date/difference.1.xml
@@ -24,5 +24,7 @@
   <date date1='2000-01-02T05:00:03' date2='2000-01-01T04:03:02'/>
   <!-- with timezone -->
   <date date1='2016-04-28T17:59:30+02:00' date2='2016-04-28T17:59:30+04:00'/>
+  <date date1='2000-01-05T01:00:00+11:00' date2='2000-01-01T23:00:00-11:00'/>
+  <date date1='2000-01-01T23:00:00-11:00' date2='2000-01-05T01:00:00+11:00'/>
 </page>
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]