diff --git a/config/maintenance/maintenance.go b/config/maintenance/maintenance.go index 967443db..72ab5f56 100644 --- a/config/maintenance/maintenance.go +++ b/config/maintenance/maintenance.go @@ -110,12 +110,13 @@ func (c *Config) IsUnderMaintenance() bool { if c.TimezoneLocation != nil { now = now.In(c.TimezoneLocation) } - var dayWhereMaintenancePeriodWouldStart time.Time - if now.Hour() >= int(c.durationToStartFromMidnight.Hours()) { - dayWhereMaintenancePeriodWouldStart = now.Truncate(24 * time.Hour) - } else { - dayWhereMaintenancePeriodWouldStart = now.Add(-c.Duration).Truncate(24 * time.Hour) + adjustedDate := now.Day() + if now.Hour() < int(c.durationToStartFromMidnight.Hours()) { + // if time in maintenance window is later than now, treat it as yesterday + adjustedDate-- } + // Set to midnight prior to adding duration + dayWhereMaintenancePeriodWouldStart := time.Date(now.Year(), now.Month(), adjustedDate, 0, 0, 0, 0, now.Location()) hasMaintenanceEveryDay := len(c.Every) == 0 hasMaintenancePeriodScheduledToStartOnThatWeekday := c.hasDay(dayWhereMaintenancePeriodWouldStart.Weekday().String()) if !hasMaintenanceEveryDay && !hasMaintenancePeriodScheduledToStartOnThatWeekday { diff --git a/config/maintenance/maintenance_test.go b/config/maintenance/maintenance_test.go index edbdad37..f8ba5cab 100644 --- a/config/maintenance/maintenance_test.go +++ b/config/maintenance/maintenance_test.go @@ -264,6 +264,15 @@ func TestConfig_IsUnderMaintenance(t *testing.T) { }, expected: true, }, + { + name: "under-maintenance-perth-timezone-starting-now-for-2h", + cfg: &Config{ + Start: fmt.Sprintf("%02d:00", inTimezone(now, "Australia/Perth", t).Hour()), + Duration: 2 * time.Hour, + Timezone: "Australia/Perth", + }, + expected: true, + }, { name: "under-maintenance-utc-timezone-starting-now-for-2h", cfg: &Config{ @@ -340,3 +349,12 @@ func normalizeHour(hour int) int { } return hour } + +func inTimezone(passedTime time.Time, timezone string, t *testing.T) time.Time { + timezoneLocation, err := time.LoadLocation(timezone) + + if err != nil { + t.Fatalf("timezone %s did not load", timezone) + } + return passedTime.In(timezoneLocation) +}