[libxslt] Keep timezone in date:add



commit b4d496ddfe33b3e22fc3e70179c4a6e49702b4cf
Author: Nick Wellnhofer <wellnhofer aevum de>
Date:   Thu Apr 28 20:14:51 2016 +0200

    Keep timezone in date:add
    
    Don't reset timezone to UTC in _exsltDateAdd. Simplify
    _exsltDateDifference which called _exsltDateAdd just to handle time
    zone offsets.
    
    Fixes bug #758192:
    
    https://bugzilla.gnome.org/show_bug.cgi?id=758192

 libexslt/date.c                   |   43 +-----------------------------------
 tests/exslt/date/add.1.out        |    4 ++-
 tests/exslt/date/add.1.xml        |    1 +
 tests/exslt/date/difference.1.out |    4 ++-
 tests/exslt/date/difference.1.xml |    2 +
 5 files changed, 11 insertions(+), 43 deletions(-)
---
diff --git a/libexslt/date.c b/libexslt/date.c
index 12c9919..87c4848 100644
--- a/libexslt/date.c
+++ b/libexslt/date.c
@@ -1478,10 +1478,6 @@ _exsltDateAdd (exsltDateValPtr dt, exsltDateValPtr dur)
     d = &(dt->value.date);
     u = &(dur->value.dur);
 
-    /* normalize for time zone offset */
-    u->sec -= (d->tzo * 60);   /* changed from + to - (bug 153000) */
-    d->tzo = 0;
-
     /* month */
     carry  = d->mon + u->mon;
     r->mon = (unsigned int)MODULO_RANGE(carry, 1, 13);
@@ -1585,40 +1581,6 @@ _exsltDateAdd (exsltDateValPtr dt, exsltDateValPtr dur)
 }
 
 /**
- * exsltDateNormalize:
- * @dt: an #exsltDateValPtr
- *
- * Normalize @dt to GMT time.
- *
- */
-static void
-exsltDateNormalize (exsltDateValPtr dt)
-{
-    exsltDateValPtr dur, tmp;
-
-    if (dt == NULL)
-        return;
-
-    if (((dt->type & XS_TIME) != XS_TIME) && (dt->value.date.tzo == 0))
-        return;
-
-    dur = exsltDateCreateDate(XS_DURATION);
-    if (dur == NULL)
-        return;
-
-    tmp = _exsltDateAdd(dt, dur);
-    if (tmp == NULL)
-        return;
-
-    memcpy(dt, tmp, sizeof(exsltDateVal));
-
-    exsltDateFreeDate(tmp);
-    exsltDateFreeDate(dur);
-
-    dt->value.date.tzo = 0;
-}
-
-/**
  * _exsltDateDifference:
  * @x: an #exsltDateValPtr
  * @y: an #exsltDateValPtr
@@ -1642,9 +1604,6 @@ _exsltDateDifference (exsltDateValPtr x, exsltDateValPtr y, int flag)
         ((y->type < XS_GYEAR) || (y->type > XS_DATETIME)))
         return NULL;
 
-    exsltDateNormalize(x);
-    exsltDateNormalize(y);
-
     /*
      * the operand with the most specific format must be converted to
      * the same type as the operand with the least specific format.
@@ -1672,6 +1631,8 @@ _exsltDateDifference (exsltDateValPtr x, exsltDateValPtr y, int flag)
                               _exsltDateCastYMToDays(x);
         ret->value.dur.day += y->value.date.day - x->value.date.day;
         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;
        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/add.1.out b/tests/exslt/date/add.1.out
index 39b3d9e..47394ae 100644
--- a/tests/exslt/date/add.1.out
+++ b/tests/exslt/date/add.1.out
@@ -26,4 +26,6 @@ result : 1999-12-31
 add    : 2000-01 + -P1D
 result : 1999-12-31
 add    : 1970-01-01T00:00:00-00:30 + -PT30S
-result : 1970-01-01T00:29:30Z
\ No newline at end of file
+result : 1969-12-31T23:59:30-00:30
+add    : 2016-04-28T18:02:44+02:00 + P1D
+result : 2016-04-29T18:02:44+02:00
\ No newline at end of file
diff --git a/tests/exslt/date/add.1.xml b/tests/exslt/date/add.1.xml
index 2181513..5555747 100644
--- a/tests/exslt/date/add.1.xml
+++ b/tests/exslt/date/add.1.xml
@@ -14,5 +14,6 @@
   <date date='2000-01'              dur='-PT86400S'/>
   <date date='2000-01'              dur='-P1D'/>
   <date date='1970-01-01T00:00:00-00:30' dur='-PT30S'/>
+  <date date='2016-04-28T18:02:44+02:00' dur='P1D'/>
 </page>
 
diff --git a/tests/exslt/date/difference.1.out b/tests/exslt/date/difference.1.out
index 8382d9f..bcafa2b 100644
--- a/tests/exslt/date/difference.1.out
+++ b/tests/exslt/date/difference.1.out
@@ -32,4 +32,6 @@ result     : PT2S
 difference : 2002-05-03T00:00:01 - 2002-05-02T23:59:59
 result     : -PT2S
 difference : 2000-01-02T05:00:03 - 2000-01-01T04:03:02
-result     : -P1DT57M1S
\ No newline at end of file
+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
diff --git a/tests/exslt/date/difference.1.xml b/tests/exslt/date/difference.1.xml
index 2e8575b..ca897c0 100644
--- a/tests/exslt/date/difference.1.xml
+++ b/tests/exslt/date/difference.1.xml
@@ -21,5 +21,7 @@
   <date date2='2002-05-02T23:59:59' date1='2002-05-03T00:00:01'/>
   <!-- result should be negative -->
   <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'/>
 </page>
 


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