aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/apoint.c5
-rw-r--r--src/recur.c15
-rw-r--r--src/ui-day.c4
-rw-r--r--src/utils.c28
4 files changed, 39 insertions, 13 deletions
diff --git a/src/apoint.c b/src/apoint.c
index a1c4934..c485477 100644
--- a/src/apoint.c
+++ b/src/apoint.c
@@ -326,7 +326,10 @@ void apoint_switch_notify(struct apoint *apt)
void apoint_paste_item(struct apoint *apt, long date)
{
- apt->start = date + get_item_time(apt->start);
+ struct tm t;
+
+ localtime_r((time_t *)&apt->start, &t);
+ apt->start = update_time_in_date(date, t.tm_hour, t.tm_min);
LLIST_TS_LOCK(&alist_p);
LLIST_TS_ADD_SORTED(&alist_p, apt, apoint_cmp);
diff --git a/src/recur.c b/src/recur.c
index 2a62e94..e4cc1b2 100644
--- a/src/recur.c
+++ b/src/recur.c
@@ -995,18 +995,23 @@ void recur_event_paste_item(struct recur_event *rev, long date)
void recur_apoint_paste_item(struct recur_apoint *rapt, long date)
{
- long time_shift;
+ long ostart = rapt->start;
+ int days;
llist_item_t *i;
+ struct tm t;
+
+ localtime_r((time_t *)&rapt->start, &t);
+ rapt->start = update_time_in_date(date, t.tm_hour, t.tm_min);
- time_shift = (date + get_item_time(rapt->start)) - rapt->start;
- rapt->start += time_shift;
+ /* The number of days shifted. */
+ days = (rapt->start - ostart) / DAYINSEC;
if (rapt->rpt->until != 0)
- rapt->rpt->until += time_shift;
+ rapt->rpt->until = date_sec_change(rapt->rpt->until, 0, days);
LLIST_FOREACH(&rapt->exc, i) {
struct excp *exc = LLIST_GET_DATA(i);
- exc->st += time_shift;
+ exc->st = date_sec_change(exc->st, 0, days);
}
LLIST_TS_LOCK(&recur_alist_p);
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)
keys_wgetch(win[KEY].p);
continue;
}
- 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)
keys_wgetch(win[KEY].p);
continue;
}
- 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,
diff --git a/src/utils.c b/src/utils.c
index 09f1f98..7b02f12 100644
--- a/src/utils.c
+++ b/src/utils.c
@@ -530,7 +530,27 @@ long date_sec_change(long date, int delta_month, int delta_day)
return t;
}
-/* A time in seconds is updated with new hour and minutes and returned. */
+/*
+ * A date in seconds is updated with new day, month and year and returned.
+ */
+static time_t update_date_in_date(time_t date, int day, int month, int year)
+{
+ struct tm lt;
+
+ localtime_r(&date, &lt);
+ lt.tm_mday = day;
+ lt.tm_mon = month - 1;
+ lt.tm_year = year - 1900;
+ lt.tm_isdst = -1;
+ date = mktime(&lt);
+ EXIT_IF(date == -1, _("error in mktime"));
+
+ return date;
+}
+
+/*
+ * A date in seconds is updated with new hour and minutes and returned.
+ */
time_t update_time_in_date(time_t date, unsigned hr, unsigned mn)
{
struct tm lt;
@@ -1218,10 +1238,8 @@ int parse_datetime(const char *string, time_t *ts, time_t dur)
} else if (parse_date_interactive(d, &year, &month, &day)) {
ret |= PARSE_DATETIME_HAS_DATE;
}
- if (ret & PARSE_DATETIME_HAS_DATE) {
- struct date date = { day , month, year };
- *ts = date2sec(date, 0, 0) + get_item_time(*ts);
- }
+ if (ret & PARSE_DATETIME_HAS_DATE)
+ *ts = update_date_in_date(*ts, day, month, year);
if (ret & PARSE_DATETIME_HAS_TIME)
*ts = update_time_in_date(*ts, hour, minute);
mem_free(d);