diff options
DST and recurrent items
The patch adresses two issues with the function recur_item_find
ocurrence(), one major: mktime(), and one minor: item duration. In
addition, some refactoring is done.
The following recurrent appointments demonstrate the problems (as
described in the message) and are used as test cases in the associated
test commit.
03/29/2019 @ 12:00 -> 03/30/2019 @ 11:00 {2D -> 04/03/2019} |two-day - every other day - not on 1/4
03/31/2019 @ 12:00 -> 03/31/2019 @ 13:00 {1D -> 04/01/2019} |daily - not on 31/3, twice on 1/4
03/31/2019 @ 04:00 -> 03/31/2019 @ 05:00 {1W} |weekly - appears after one week
03/31/2019 @ 12:00 -> 03/31/2019 @ 12:00 {1M} |monthly - never appears
03/31/2019 @ 12:00 -> 03/31/2019 @ 12:00 {1Y} |yearly - never appears
10/20/2019 @ 00:00 -> 10/21/2019 @ 01:00 {1W -> 11/03/2019} |25 hours - ends on 27th, but continues on 28th
03/24/2019 @ 00:00 -> 03/25/2019 @ 00:00 {1W -> 04/07/2019} |24 hours - does not continue on April 1
The root cause is two mktime() calls in recur_item_find_occurrence(),
both of which use an inherited tm_isdst value in the tm structure. In
such cases mktime() will "normalize" the tm stucture if tm_isdst is 0 or
1 and in disagreement with the rest of the tm contents (just like 32 May
will be normalized to 1 June).
Example. In 2019 DST started on 31/3 at 02:00:00 (in the European
Union). If the (local) time "31/3/2018 00:00:00" is passed to mktime()
with tm_isdst = 0, the return value is (say) T sec and the tm structure
is unchanged, because DST is not in effect at midnight. If the same call
is performed with tm_isdst = 1, the return value becomes (T - 3600) sec
and the tm structure is normalized to "30/3/2018 23:00:00", tm_isdst =
0.
In recur_item_find_occurrence(), the normalized tm structure with wrong
day and time is used in ensuing calculations, leading to wrong dates and
the errors observed.
The first mktime() call is used to calculate the "day span" of the
occurrence before the occurrence itself has been determined. But once
the occurence is known, the "day span" is easily determined, and there
is no need for the first mktime() call.
Events have no explicit duration. However, recur_event_find_occurrence()
and recur_event_inday() set the duration of an event to DAYINSEC before
passing it on to recur_item_find_occurrence(). The value is not correct
on the day when DST begins or ends. The interpretation of the daylength
should be left to the called function. Hence, duration is set to -1 to
signal no (explicit) duration.
Signed-off-by: Lars Henriksen <LarsHenriksen@get2net.dk>
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
Diffstat (limited to 'test%25252525252525253fid%25252525252525253de25710f65057fb8290024a8fb4a11f1c5d4e2ee7%252525252525253fid%252525252525253de25710f65057fb8290024a8fb4a11f1c5d4e2ee7&id2%252525252525253d0e46881746c1a639933d1b794bd2438a430c9c3a%2525252525253fid%2525252525253de25710f65057fb8290024a8fb4a11f1c5d4e2ee7%25252525253fid%25252525253de25710f65057fb8290024a8fb4a11f1c5d4e2ee7%252525253fid%252525253de25710f65057fb8290024a8fb4a11f1c5d4e2ee7%2525253fid%2525253de25710f65057fb8290024a8fb4a11f1c5d4e2ee7%25253fid%25253de25710f65057fb8290024a8fb4a11f1c5d4e2ee7&id2%25253d0e46881746c1a639933d1b794bd2438a430c9c3a%253fid%253de25710f65057fb8290024a8fb4a11f1c5d4e2ee7%3fid%3de25710f65057fb8290024a8fb4a11f1c5d4e2ee7?id=0e46881746c1a639933d1b794bd2438a430c9c3a')
0 files changed, 0 insertions, 0 deletions