I think this fixes the problem (in gbx_date.c): int DATE_diff(VALUE *date1, VALUE *date2, int period) { int64_t diff = 0; int sdiff, tmpdiff; DATE_SERIAL ds1 = {0}; DATE_SERIAL ds2 = {0}; bool neg;
switch (period) { case DP_DAY: case DP_WEEK: diff = date1->_date.date - date2->_date.date; sdiff = lsgn(diff); tmpdiff = lsgn(date1->_date.time - date2->_date.time); if (sdiff != tmpdiff && tmpdiff != 0) diff -= sdiff; break; case DP_MILLISECOND: case DP_SECOND: case DP_MINUTE: case DP_HOUR: diff = date1->_date.date - date2->_date.date; diff = diff * 86400000 + (date1->_date.time - date2->_date.time); break; case DP_MONTH: case DP_QUARTER: case DP_YEAR: ds1 = *DATE_split(date1); ds2 = *DATE_split(date2); break; case DP_WEEKDAY: diff = date1->_date.date - date2->_date.date; sdiff = lsgn(diff); if (sdiff != lsgn(date1->_date.time - date2->_date.time)) diff -= sdiff; ds1 = *DATE_split(date1); ds2 = *DATE_split(date2); break; default: THROW(E_ARG); } switch (period) { case DP_DAY: break; case DP_WEEK: diff /= 7; break; case DP_SECOND: diff /= 1000; break; case DP_MINUTE: diff /= 60000; break; case DP_HOUR: diff /= 3600000; break; case DP_WEEKDAY: neg = (diff < 0); if (neg) { int swap; diff = (-diff); swap = ds1.weekday; ds1.weekday = ds2.weekday; ds2.weekday = swap; } diff = diff / 7 * 5; /* last day is not included ! */ while (ds2.weekday != ds1.weekday) { if (ds2.weekday > 0 && ds2.weekday < 6) diff++; ds2.weekday++; if (ds2.weekday == 7) ds2.weekday = 0; } if (neg) diff = (-diff); break; case DP_MONTH: diff = (ds1.year - ds2.year) * 12 + ds1.month - ds2.month; break; case DP_QUARTER: diff = (ds1.year - ds2.year) * 4 + (ds1.month - ds2.month) / 3; break; case DP_YEAR: diff = ds1.year - ds2.year; break; case DP_MILLISECOND: break; } if (diff < INT32_MIN || diff > INT32_MAX) THROW(E_OVERFLOW); return diff; } Can someone confirm my fix to the function? Jussi On Thu, Aug 13, 2015 at 5:22 PM, Adrien Prokopowicz < adrien.prokopow...@gmail.com> wrote: > Le Mon, 10 Aug 2015 13:41:17 +0200, Jussi Lahtinen > <jussi.lahti...@gmail.com> a écrit: > > > Sorry to say, but this doesn't seem to be fixed. > > > > ? DateDiff(Now, DateAdd(Now, gb.Day, 2), gb.Day) > > 1 > > > > > > Jussi > > > > On Sat, Aug 1, 2015 at 7:16 PM, Benoît Minisini < > > gam...@users.sourceforge.net> wrote: > > > >> Le 01/08/2015 17:52, Benoît Minisini a écrit : > >> > Le 01/08/2015 17:33, nando a écrit : > >> >> Here's an example. > >> >> > >> >> Dim FirstDate as Date > >> >> > >> >> FirstDate = Date(2015, 1, 1, 0, 0, 0, 0) > >> >> Print DateDiff(firstdate, Date(2015, 8, 1, 00, 00, 00), gb.day) > >> 'ok > >> >> Print DateDiff(firstdate, Date(2015, 8, 1, 00, 00, 01), gb.day) > >> 'ok > >> >> Print DateDiff(firstdate, Date(2015, 8, 1, 03, 59, 59), gb.day) > >> 'ok > >> >> Print DateDiff(firstdate, Date(2015, 8, 1, 04, 00, 00), gb.day) > >> >> 'Wrong > >> >> Print DateDiff(firstdate, Date(2015, 8, 1, 11, 21, 51), gb.day) > >> >> 'Wrong > >> >> > >> >> 212 > >> >> 212 > >> >> 212 > >> >> 213 <---Wrong should be 212 > >> >> 213 <---Wrong should be 212 > >> >> > >> >> Of course, this is looks like it might be a TimeZone problem. > >> >> I am in GMT -5 but daylight savings during the summer it is -4 > >> >> > >> >> Am I correct to say this is not correct operation? > >> >> > >> >> -Nando > >> >> > >> >> > >> > > >> > Argh, a just too late bug! You did that to spoil my holidats? 8-o > >> > > >> > >> OK, I couldn't let you alone. I have updated the Gambas 3.8 source > >> package with the fix for that bug. > >> > >> Regards, > >> > >> -- > >> Benoît Minisini > > That's weird, but the examples given (both jussi's and nando's) all work > correctly before Benoît's fix (pre-7212), but not after (post-7212) ! > > Am I missing something completely obvious, or do you get the same behavior > ? > > Here's my test code : > > Dim FirstDate As Date > > FirstDate = Date(2015, 1, 1, 0, 0, 0, 0) > Print DateDiff(firstdate, Date(2015, 8, 1, 00, 00, 00), gb.day) > Print DateDiff(firstdate, Date(2015, 8, 1, 00, 00, 01), gb.day) > Print DateDiff(firstdate, Date(2015, 8, 1, 03, 59, 59), gb.day) > Print DateDiff(firstdate, Date(2015, 8, 1, 04, 00, 00), gb.day) > Print DateDiff(firstdate, Date(2015, 8, 1, 11, 21, 51), gb.day) > Print DateDiff(firstdate, DateAdd(firstdate, GB.Day, 2), GB.Day) > > Output (Before 7212) : > > 212 > 212 > 212 > 212 > 212 > 2 > > Output (After 7212) : > > 211 > 212 > 212 > 212 > 212 > 1 > > -- > Adrien Prokopowicz > > > ------------------------------------------------------------------------------ > _______________________________________________ > Gambas-user mailing list > Gambas-user@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/gambas-user > ------------------------------------------------------------------------------ _______________________________________________ Gambas-user mailing list Gambas-user@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/gambas-user