[libxslt] Fix date:difference with time zones
- From: Nick Wellnhofer <nwellnhof src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [libxslt] Fix date:difference with time zones
- Date: Thu, 18 May 2017 16:25:11 +0000 (UTC)
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]