From d94429d33c0586c32e491c3de6e4bf5f42822f00 Mon Sep 17 00:00:00 2001 From: Dominik Pschenitschni <6173598+dpschen@users.noreply.github.com> Date: Tue, 10 Jun 2025 22:17:40 +0200 Subject: [PATCH] fix(caldav): parse timestamps in configured timezone --- pkg/caldav/parsing.go | 19 ++++++++----------- pkg/caldav/parsing_test.go | 13 +++++++++++++ 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/pkg/caldav/parsing.go b/pkg/caldav/parsing.go index cf4966cbd..3d73ac88a 100644 --- a/pkg/caldav/parsing.go +++ b/pkg/caldav/parsing.go @@ -491,23 +491,20 @@ func caldavTimeToTimestamp(ianaProperty ics.IANAProperty) time.Time { var err error tzParameter := ianaProperty.ICalParameters["TZID"] if len(tzParameter) > 0 { - loc, err := time.LoadLocation(tzParameter[0]) - if err != nil { - log.Warningf("Error while parsing caldav timezone %s: %s", tzParameter[0], err) + loc, locErr := time.LoadLocation(tzParameter[0]) + if locErr != nil { + log.Warningf("Error while parsing caldav timezone %s: %s", tzParameter[0], locErr) } else { t, err = time.ParseInLocation(format, tstring, loc) - if err != nil { - log.Warningf("Error while parsing caldav time %s to TimeStamp: %s at location %s", tstring, loc, err) - } else { - t = t.In(config.GetTimeZone()) - return t - } } + } else { + t, err = time.ParseInLocation(format, tstring, config.GetTimeZone()) } - t, err = time.Parse(format, tstring) + if err != nil { log.Warningf("Error while parsing caldav time %s to TimeStamp: %s", tstring, err) return time.Time{} } - return t + + return t.In(config.GetTimeZone()) } diff --git a/pkg/caldav/parsing_test.go b/pkg/caldav/parsing_test.go index d1ba87cf6..a86950ab2 100644 --- a/pkg/caldav/parsing_test.go +++ b/pkg/caldav/parsing_test.go @@ -24,6 +24,7 @@ import ( "code.vikunja.io/api/pkg/config" "code.vikunja.io/api/pkg/log" "code.vikunja.io/api/pkg/models" + ics "github.com/arran4/golang-ical" "gopkg.in/d4l3k/messagediff.v1" ) @@ -717,3 +718,15 @@ END:VCALENDAR`, }) } } + +func TestCaldavTimeToTimestamp_NoTZID(t *testing.T) { + config.InitDefaultConfig() + prop := ics.IANAProperty{BaseProperty: ics.BaseProperty{Value: "20181201T011204", ICalParameters: map[string][]string{}}} + + got := caldavTimeToTimestamp(prop) + want := time.Date(2018, 12, 1, 1, 12, 4, 0, config.GetTimeZone()) + + if !got.Equal(want) || got.Location().String() != config.GetTimeZone().String() { + t.Fatalf("caldavTimeToTimestamp() = %v, want %v", got, want) + } +}