path: root/src/ui-day.c
diff options
authorLars Henriksen <LarsHenriksen@get2net.dk>2018-10-31 15:23:41 +0100
committerLukas Fleischer <lfleischer@calcurse.org>2018-11-10 12:19:28 +0100
commit4263a2850431b7328699c713b4e97667f9ba02e2 (patch)
treec15245e7187be4f081a90e851e77ae7093e8af64 /src/ui-day.c
parentf91b7cdee0efb7af2989eed56b6e3248da2b6712 (diff)
DST fix: adjusting time in appointments
Calcurse saves time and date information on disk as local time in readable text file format. When loaded from disk or when entered by the user, local time is converted to Unix time (seconds since 00:00:00, 1 January 1970). When displayed, and later when saved to disk, the Unix time is converted back to readable local time. Both conversions depend on DST. Hence, if midnight for a day with DST in effect (i.e. local time) is converted, increased with an amount and converted back, the amount has changed if DST is _not_ in effect for the resulting time. In general, calculations on Unix time variables should be used with caution because of the DST-dependent conversions. Instead, the calculations should be performed on local time data with the help of mktime(). The commit fixes start time for pasted appointments (ordinary and recurrent) and the 'until'-date of recurrent appointments, pasted as well as new and edited. The latter problem is slightly different in that the adjustment is a number of days, as it is for exception dates. Update of the date in parse_datetime() has been corrected to be similar to update of the time, although no problem has been identified. Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
Diffstat (limited to 'src/ui-day.c')
1 files changed, 2 insertions, 2 deletions
diff --git a/src/ui-day.c b/src/ui-day.c
index 9a118dc..979ecc0 100644
--- a/src/ui-day.c
+++ b/src/ui-day.c
@@ -332,7 +332,7 @@ static void update_rept(struct rpt **rpt, const long start)
- newuntil = start + days * DAYINSEC;
+ newuntil = date_sec_change(start, 0, days);
} else {
int year, month, day;
if (!parse_date(timstr, conf.input_datefmt, &year,
@@ -836,7 +836,7 @@ void ui_day_item_repeat(void)
- until = p->start + days * DAYINSEC;
+ until = date_sec_change(p->start, 0, days);
} else {
int year, month, day;
if (!parse_date(user_input, conf.input_datefmt,