summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Wellnhofer <wellnhofer@aevum.de>2016-04-28 20:14:51 +0200
committerNick Wellnhofer <wellnhofer@aevum.de>2016-04-28 20:31:14 +0200
commitb4d496ddfe33b3e22fc3e70179c4a6e49702b4cf (patch)
treeaf6e73755b48cf4c263b30378ce36b3552a9131f
parent5d0c6565bab5b9b7efceb33b626916d22b4101a7 (diff)
downloadlibxslt-b4d496ddfe33b3e22fc3e70179c4a6e49702b4cf.tar.gz
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
-rw-r--r--libexslt/date.c43
-rw-r--r--tests/exslt/date/add.1.out4
-rw-r--r--tests/exslt/date/add.1.xml1
-rw-r--r--tests/exslt/date/difference.1.out4
-rw-r--r--tests/exslt/date/difference.1.xml2
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);
@@ -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 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 @@
<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 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 @@
<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>