First semi-sorta-working time zone adjustment.

This commit is contained in:
Dianne Skoll
2025-09-03 12:22:09 -04:00
parent 651368fedc
commit 7979a69cb9
5 changed files with 53 additions and 2 deletions

View File

@@ -35,6 +35,43 @@ static int ComputeTrigDuration(TimeTrig const *t);
static int CalledEnterTimezone = 0;
static int AdjustTriggerForTimeZone(Trigger const *trig, int dse, TimeTrig *tim)
{
int y, m, d, hour, minute;
int r;
struct tm tm;
if (!trig->tz) {
/* Already local time - no adjustments needed */
return dse;
}
FromDSE(dse, &y, &m, &d);
hour = tim->ttime_orig / 60;
minute = tim->ttime_orig % 60;
r = tz_convert(y, m, d, hour, minute, trig->tz, LocalTimeZone, &tm);
if (r != 1) {
Wprint(tr("Error adjusting trigger to local time zone"));
return dse;
}
dse = DSE(tm.tm_year+1900, tm.tm_mon, tm.tm_mday);
tim->ttime = tm.tm_hour * 60 + tm.tm_min;
SaveAllTriggerInfo(trig, tim, dse, tim->ttime, 1);
if (DebugFlag & DB_PRTTRIG) {
fprintf(ErrFp, "%s(%s): Trig(tz_adj %s) = %s, %d %s, %d AT %02d:%02d",
GetCurrentFilename(), line_range(LineNoStart, LineNo), trig->tz,
get_day_name(dse % 7), tm.tm_mday, get_month_name(tm.tm_mon),
1900 + tm.tm_year, tim->ttime / 60, tim->ttime % 60);
if (tim->duration != NO_TIME) {
fprintf(ErrFp, " DURATION %02d:%02d",
(tim->duration / 60),
(tim->duration % 60));
}
fprintf(ErrFp, "\n");
}
return dse;
}
static void ExitTimezone(char const *tz)
{
if (!CalledEnterTimezone) {
@@ -396,7 +433,9 @@ int DoRem(ParsePtr p)
PurgeEchoLine("%s\n", "#!P: Cannot purge SATISFY-type reminders");
}
PurgeEchoLine("%s\n", CurLine);
EnterTimezone(trig.tz);
r=DoSatRemind(&trig, &tim, p);
ExitTimezone(trig.tz);
if (r) {
if (r == E_CANT_TRIG && trig.maybe_uncomputable) {
r = OK;
@@ -523,6 +562,11 @@ int DoRem(ParsePtr p)
}
r = OK;
/* Adjust trigger date/time to time zone */
if (dse >= 0) {
dse = AdjustTriggerForTimeZone(&trig, dse, &tim);
}
if (ShouldTriggerReminder(&trig, &tim, dse, &err)) {
/* Filter unwanted events/todos */
if (todo_filtered(&trig)) {
@@ -755,6 +799,7 @@ int ParseRem(ParsePtr s, Trigger *trig, TimeTrig *tim)
DBufInit(&(trig->tags));
trig->passthru[0] = 0;
tim->ttime = NO_TIME;
tim->ttime_orig = NO_TIME;
tim->delta = DefaultTDelta;
tim->rep = NO_REP;
tim->duration = NO_TIME;
@@ -827,6 +872,7 @@ int ParseRem(ParsePtr s, Trigger *trig, TimeTrig *tim)
trig->m = m;
trig->d = d;
tim->ttime = (tok.val % MINUTES_PER_DAY);
tim->ttime_orig = tim->ttime;
break;
case T_WkDay:
@@ -882,6 +928,7 @@ int ParseRem(ParsePtr s, Trigger *trig, TimeTrig *tim)
DBufFree(&buf);
if (tim->ttime != NO_TIME) return E_TIME_TWICE;
tim->ttime = tok.val;
tim->ttime_orig = tok.val;
r = ParseTimeTrig(s, tim);
if (r) return r;
trig->duration_days = ComputeTrigDuration(tim);
@@ -1200,6 +1247,7 @@ static int ParseTimeTrig(ParsePtr s, TimeTrig *tim)
DBufFree(&buf);
if (tim->ttime != NO_TIME) return E_TIME_TWICE;
tim->ttime = tok.val;
tim->ttime_orig = tok.val;
break;
case T_Delta:

View File

@@ -3891,7 +3891,7 @@ int tz_set_tz(char const *tz)
return r;
}
static int tz_convert(int year, int month, int day,
int tz_convert(int year, int month, int day,
int hour, int minute,
char const *src_tz, char const *tgt_tz,
struct tm *tm)

View File

@@ -2045,7 +2045,7 @@ FreeTrig(Trigger *t)
FreeTrigInfoChain(t->infos);
}
if (t->tz) {
free(t->tz);
free( (void *) t->tz);
}
t->tz = NULL;
t->infos = NULL;
@@ -2080,6 +2080,7 @@ ClearLastTriggers(void)
FreeTrig(&LastTrigger);
LastTimeTrig.ttime = NO_TIME;
LastTimeTrig.ttime_orig = NO_TIME;
LastTimeTrig.delta = NO_DELTA;
LastTimeTrig.rep = NO_REP;
LastTimeTrig.duration = NO_TIME;

View File

@@ -297,3 +297,4 @@ void set_cloexec(int fd);
int system_to_stderr(char const *cmd);
int system1(char const *cmd);
int tz_set_tz (char const *tz);
int tz_convert(int year, int month, int day, int hour, int minute, char const *src_tz, char const *tgt_tz, struct tm *tm);

View File

@@ -157,6 +157,7 @@ typedef struct {
/* A time trigger */
typedef struct {
int ttime_orig;
int ttime;
int nexttime;
int delta;