From a19cd70d89558acf5da9b05571c2e00c4a08bf20 Mon Sep 17 00:00:00 2001 From: "J. Auer" Date: Tue, 11 Jul 2017 01:22:45 -0600 Subject: [PATCH 1/2] add support for local and utc date-time --- parse.go | 19 ++++++++++++++----- parse_test.go | 24 +++++++++++++++++++++++- 2 files changed, 37 insertions(+), 6 deletions(-) diff --git a/parse.go b/parse.go index b81a8f1..eed8a17 100644 --- a/parse.go +++ b/parse.go @@ -504,7 +504,20 @@ func hasProperty(name string, properties []*Property) bool { // parseDate transform an ical date into a time.Time func parseDate(prop *Property) (time.Time, error) { - layout := dateTimeLayoutUTC + if tz, ok := prop.Params["TZID"]; ok { + loc, _ := time.LoadLocation(tz.Values[0]) + return time.ParseInLocation(dateTimeLayoutLocalized, prop.Value, loc) + } + + layout := dateTimeLayoutLocalized + + if strings.HasSuffix(prop.Value, "Z") { + return time.Parse(dateTimeLayoutUTC, prop.Value) + } + + if len(prop.Value) == 15 { + return time.Parse(dateTimeLayoutLocalized, prop.Value) + } if val, ok := prop.Params["VALUE"]; ok { switch val.Values[0] { @@ -512,10 +525,6 @@ func parseDate(prop *Property) (time.Time, error) { layout = dateLayout } } - if tz, ok := prop.Params["TZID"]; ok { - loc, _ := time.LoadLocation(tz.Values[0]) - return time.ParseInLocation(dateTimeLayoutLocalized, prop.Value, loc) - } return time.Parse(layout, prop.Value) } diff --git a/parse_test.go b/parse_test.go index 52ee455..3fe2bec 100644 --- a/parse_test.go +++ b/parse_test.go @@ -38,14 +38,36 @@ var dateList = []*Property{ }, Value: "19980119T020000", }, + // Floating (local) date-time (no time zone) + &Property{ + Name: "DSTART", + Params: map[string]*Param{ + "VALUE": &Param{ + Values: []string{"DATE"}, + }, + }, + Value: "19980119T020000", + }, + // Date-time in UTC + &Property{ + Name: "DSTART", + Params: map[string]*Param{ + "VALUE": &Param{ + Values: []string{"DATE"}, + }, + }, + Value: "19980119T070000Z", + }, } func TestParseDate(t *testing.T) { for _, prop := range dateList { - _, err := parseDate(prop) + out, err := parseDate(prop) if err != nil { t.Error(err) + } else { + t.Logf("in: %+v, out: %s", prop.Value, out) } } } From 245a4016058b67c2b595b7b832c7d6e77d9e655b Mon Sep 17 00:00:00 2001 From: "J. Auer" Date: Tue, 11 Jul 2017 01:30:56 -0600 Subject: [PATCH 2/2] rfc5545 says date-time without tz is local --- parse.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parse.go b/parse.go index eed8a17..5d86a23 100644 --- a/parse.go +++ b/parse.go @@ -516,7 +516,7 @@ func parseDate(prop *Property) (time.Time, error) { } if len(prop.Value) == 15 { - return time.Parse(dateTimeLayoutLocalized, prop.Value) + return time.ParseInLocation(dateTimeLayoutLocalized, prop.Value, time.Local) } if val, ok := prop.Params["VALUE"]; ok {