From b4d496ddfe33b3e22fc3e70179c4a6e49702b4cf Mon Sep 17 00:00:00 2001 From: Nick Wellnhofer Date: Thu, 28 Apr 2016 20:14:51 +0200 Subject: 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 12c99193..87c48487 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); @@ -1584,40 +1580,6 @@ _exsltDateAdd (exsltDateValPtr dt, exsltDateValPtr dur) return ret; } -/** - * 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 @@ -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 39b3d9e4..47394ae2 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 21815131..5555747e 100644 --- a/tests/exslt/date/add.1.xml +++ b/tests/exslt/date/add.1.xml @@ -14,5 +14,6 @@ + diff --git a/tests/exslt/date/difference.1.out b/tests/exslt/date/difference.1.out index 8382d9f3..bcafa2ba 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 2e8575bb..ca897c09 100644 --- a/tests/exslt/date/difference.1.xml +++ b/tests/exslt/date/difference.1.xml @@ -21,5 +21,7 @@ + + -- cgit v1.2.1