Add timezone support to evaltrig.

This commit is contained in:
Dianne Skoll
2025-09-03 12:42:59 -04:00
parent 32f4b125b5
commit 272336226e
3 changed files with 16 additions and 8 deletions

View File

@@ -2044,9 +2044,7 @@ static int DoCalRem(ParsePtr p, int col)
}
/* Adjust trigger date/time to time zone */
if (dse >= 0) {
dse = AdjustTriggerForTimeZone(&trig, dse, &tim);
}
dse = AdjustTriggerForTimeZone(&trig, dse, &tim);
/* Add to global OMITs if so indicated */
if (trig.addomit) {

View File

@@ -40,8 +40,8 @@ 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 */
if (!trig->tz || dse < 0) {
/* Already local time or did not compute trigger date - no adjustments needed */
return dse;
}
FromDSE(dse, &y, &m, &d);
@@ -514,9 +514,7 @@ int DoRem(ParsePtr p)
}
/* Adjust trigger date/time to time zone */
if (dse >= 0) {
dse = AdjustTriggerForTimeZone(&trig, dse, &tim);
}
dse = AdjustTriggerForTimeZone(&trig, dse, &tim);
/* Add to global OMITs if so indicated */
if (trig.addomit) {

View File

@@ -4222,13 +4222,17 @@ FEvalTrig(func_info *info)
return E_PARSE_ERR;
}
if (scanfrom == NO_DATE) {
EnterTimezone(trig.tz);
dse = ComputeTrigger(get_scanfrom(&trig), &trig, &tim, &r, 0);
ExitTimezone(trig.tz);
} else {
/* Hokey... */
if (get_scanfrom(&trig) != DSEToday) {
Wprint(tr("Warning: SCANFROM is ignored in two-argument form of evaltrig()"));
}
EnterTimezone(trig.tz);
dse = ComputeTrigger(scanfrom, &trig, &tim, &r, 0);
ExitTimezone(trig.tz);
}
if (r == E_CANT_TRIG && trig.maybe_uncomputable) {
r = 0;
@@ -4244,6 +4248,7 @@ FEvalTrig(func_info *info)
RetVal.type = DATE_TYPE;
RETVAL = dse;
} else {
dse = AdjustTriggerForTimeZone(&trig, dse, &tim);
RetVal.type = DATETIME_TYPE;
RETVAL = (MINUTES_PER_DAY * dse) + tim.ttime;
}
@@ -4284,10 +4289,14 @@ FMultiTrig(func_info *info)
Eprint(tr("Cannot use AT clause in multitrig() function"));
return E_PARSE_ERR;
}
EnterTimezone(trig.tz);
dse = ComputeTrigger(get_scanfrom(&trig), &trig, &tim, &r, 0);
ExitTimezone(trig.tz);
DestroyParser(&p);
if (r != E_CANT_TRIG) {
dse = AdjustTriggerForTimeZone(&trig, dse, &tim);
if (dse < earliest || earliest < 0) {
earliest = dse;
}
@@ -4337,13 +4346,16 @@ FTrig(func_info *info)
FreeTrig(&trig);
return E_PARSE_ERR;
}
EnterTimezone(trig.tz);
dse = ComputeTrigger(get_scanfrom(&trig), &trig, &tim, &r, 0);
ExitTimezone(trig.tz);
DestroyParser(&p);
if (r == E_CANT_TRIG) {
FreeTrig(&trig);
continue;
}
dse = AdjustTriggerForTimeZone(&trig, dse, &tim);
if (ShouldTriggerReminder(&trig, &tim, dse, &r)) {
LastTrig = dse;
RETVAL = dse;