diff --git a/internal/cmd/calendar_event_days.go b/internal/cmd/calendar_event_days.go index d4f55d0..d30a030 100644 --- a/internal/cmd/calendar_event_days.go +++ b/internal/cmd/calendar_event_days.go @@ -120,15 +120,7 @@ func parseEventDate(value string, tz string) (time.Time, bool) { } func loadEventLocation(tz string) (*time.Location, bool) { - tz = strings.TrimSpace(tz) - if tz == "" { - return nil, false - } - loc, err := time.LoadLocation(tz) - if err != nil { - return nil, false - } - return loc, true + return tryLoadTimezoneLocation(tz) } // resolveEventTimezone resolves the timezone and location for an event. @@ -140,7 +132,7 @@ func resolveEventTimezone(event *calendar.Event, calendarTimezone string, loc *t evTimezone := eventTimezone(event) if loc == nil && calendarTimezone != "" { - if loaded, err := time.LoadLocation(calendarTimezone); err == nil { + if loaded, ok := tryLoadTimezoneLocation(calendarTimezone); ok { loc = loaded } else { calendarTimezone = "" @@ -149,7 +141,7 @@ func resolveEventTimezone(event *calendar.Event, calendarTimezone string, loc *t if calendarTimezone == "" { calendarTimezone = evTimezone if loc == nil && calendarTimezone != "" { - if loaded, err := time.LoadLocation(calendarTimezone); err == nil { + if loaded, ok := tryLoadTimezoneLocation(calendarTimezone); ok { loc = loaded } else { calendarTimezone = "" diff --git a/internal/cmd/time_helpers.go b/internal/cmd/time_helpers.go index 11463bf..aaf4d14 100644 --- a/internal/cmd/time_helpers.go +++ b/internal/cmd/time_helpers.go @@ -49,7 +49,7 @@ func getCalendarLocation(ctx context.Context, svc *calendar.Service, calendarID if cal.TimeZone == "" { return "", nil, fmt.Errorf("calendar %q has no timezone set", calendarID) } - loc, err := time.LoadLocation(cal.TimeZone) + loc, err := loadTimezoneLocation(cal.TimeZone) if err != nil { return "", nil, fmt.Errorf("invalid calendar timezone %q: %w", cal.TimeZone, err) } @@ -86,32 +86,32 @@ func getUserTimezone(ctx context.Context, svc *calendar.Service) (*time.Location } func timezoneFromCalendarList(calendars []*calendar.CalendarListEntry) (*time.Location, error) { - ordered := make([]*calendar.CalendarListEntry, 0, len(calendars)) - for _, cal := range calendars { - if cal != nil && cal.Primary { - ordered = append(ordered, cal) - } - } - for _, cal := range calendars { - if cal != nil && !cal.Primary { - ordered = append(ordered, cal) - } - } - + var fallback *time.Location var firstInvalid error - for _, cal := range ordered { + for _, cal := range calendars { + if cal == nil { + continue + } tz := strings.TrimSpace(cal.TimeZone) if tz == "" { continue } - loc, err := time.LoadLocation(tz) + loc, err := loadTimezoneLocation(tz) if err != nil { if firstInvalid == nil { firstInvalid = fmt.Errorf("invalid calendar timezone %q on calendar %q: %w", tz, cal.Id, err) } continue } - return loc, nil + if cal.Primary { + return loc, nil + } + if fallback == nil { + fallback = loc + } + } + if fallback != nil { + return fallback, nil } if firstInvalid != nil { return nil, firstInvalid @@ -124,7 +124,7 @@ func loadTimezoneOrUTC(timezone string) (*time.Location, error) { if strings.TrimSpace(timezone) == "" { return time.UTC, nil } - loc, err := time.LoadLocation(timezone) + loc, err := loadTimezoneLocation(timezone) if err != nil { return nil, fmt.Errorf("invalid calendar timezone %q: %w", timezone, err) }