From 0360d1282f89baf070fc6910057a9918e7116c9b Mon Sep 17 00:00:00 2001 From: Aaron Raddon Date: Sat, 6 Feb 2021 13:42:06 -0800 Subject: [PATCH] Support len 2 TZ offsets: 2019-05-29T08:41-04 fixes #111 --- README.md | 2 ++ example/main.go | 2 ++ parseany.go | 17 ++++++++++++++--- parseany_test.go | 13 +++++++++---- 4 files changed, 27 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 7ab8cd0..d08d0dd 100644 --- a/README.md +++ b/README.md @@ -130,6 +130,7 @@ var examples = []string{ "2009-08-12T22:15:09.988", "2009-08-12T22:15:09Z", "2017-07-19T03:21:51:897+0100", + "2019-05-29T08:41-04", // no seconds, 2 digit TZ offset // yyyy-mm-dd hh:mm:ss "2014-04-26 17:24:37.3186369", "2012-08-03 18:31:59.257000000", @@ -278,6 +279,7 @@ func main() { | 2009-08-12T22:15:09.988 | 2009-08-12 22:15:09.988 +0000 UTC | | 2009-08-12T22:15:09Z | 2009-08-12 22:15:09 +0000 UTC | | 2017-07-19T03:21:51:897+0100 | 2017-07-19 03:21:51.897 +0100 +0100 | +| 2019-05-29T08:41-04 | 2019-05-29 08:41:00 -0400 -0400 | | 2014-04-26 17:24:37.3186369 | 2014-04-26 17:24:37.3186369 +0000 UTC | | 2012-08-03 18:31:59.257000000 | 2012-08-03 18:31:59.257 +0000 UTC | | 2014-04-26 17:24:37.123 | 2014-04-26 17:24:37.123 +0000 UTC | diff --git a/example/main.go b/example/main.go index 0cfc745..8dc6aa7 100644 --- a/example/main.go +++ b/example/main.go @@ -87,6 +87,7 @@ var examples = []string{ "2009-08-12T22:15:09.988", "2009-08-12T22:15:09Z", "2017-07-19T03:21:51:897+0100", + "2019-05-29T08:41-04", // no seconds, 2 digit TZ offset // yyyy-mm-dd hh:mm:ss "2014-04-26 17:24:37.3186369", "2012-08-03 18:31:59.257000000", @@ -235,6 +236,7 @@ func main() { | 2009-08-12T22:15:09.988 | 2009-08-12 22:15:09.988 +0000 UTC | | 2009-08-12T22:15:09Z | 2009-08-12 22:15:09 +0000 UTC | | 2017-07-19T03:21:51:897+0100 | 2017-07-19 03:21:51.897 +0100 +0100 | +| 2019-05-29T08:41-04 | 2019-05-29 08:41:00 -0400 -0400 | | 2014-04-26 17:24:37.3186369 | 2014-04-26 17:24:37.3186369 +0000 UTC | | 2012-08-03 18:31:59.257000000 | 2012-08-03 18:31:59.257 +0000 UTC | | 2014-04-26 17:24:37.123 | 2014-04-26 17:24:37.123 +0000 UTC | diff --git a/parseany.go b/parseany.go index d803e43..d59b441 100644 --- a/parseany.go +++ b/parseany.go @@ -1645,8 +1645,18 @@ iterRunes: case timePeriod: p.mslen = i - p.msi case timeOffset: - // 19:55:00+0100 - p.set(p.offseti, "-0700") + + switch len(p.datestr) - p.offseti { + case 0, 1, 2, 4: + return p, fmt.Errorf("TZ offset not recognized %q near %q (must be 2 or 4 digits optional colon)", datestr, string(datestr[p.offseti:])) + case 3: + // 19:55:00+01 + p.set(p.offseti, "-07") + case 5: + // 19:55:00+0100 + p.set(p.offseti, "-0700") + } + case timeWsOffset: p.set(p.offseti, "-0700") case timeWsOffsetWs: @@ -2104,10 +2114,11 @@ func (p *parser) parse() (time.Time, error) { p.datestr = p.datestr[p.skip:] } - // gou.Debugf("parse %q AS %q", p.datestr, string(p.format)) if p.loc == nil { + //gou.Debugf("parse layout=%q input=%q \ntx, err := time.Parse(%q, %q)", string(p.format), p.datestr, string(p.format), p.datestr) return time.Parse(string(p.format), p.datestr) } + //gou.Debugf("parse layout=%q input=%q \ntx, err := time.ParseInLocation(%q, %q, %v)", string(p.format), p.datestr, string(p.format), p.datestr, p.loc) return time.ParseInLocation(string(p.format), p.datestr, p.loc) } func isDay(alpha string) bool { diff --git a/parseany_test.go b/parseany_test.go index 06357e2..cacb53e 100644 --- a/parseany_test.go +++ b/parseany_test.go @@ -11,8 +11,8 @@ import ( func TestOne(t *testing.T) { time.Local = time.UTC var ts time.Time - ts = MustParse("2020-08-17T17:00:00:987+0100") - assert.Equal(t, "2020-08-17 16:00:00.987 +0000 UTC", fmt.Sprintf("%v", ts.In(time.UTC))) + ts = MustParse("2019-05-29T08:41-04") + assert.Equal(t, "2019-05-29 12:41:00 +0000 UTC", fmt.Sprintf("%v", ts.In(time.UTC))) } type dateTest struct { @@ -364,6 +364,8 @@ var testInputs = []dateTest{ {in: "2009-08-12T22:15:09.123-07:00", out: "2009-08-13 05:15:09.123 +0000 UTC"}, {in: "2016-06-21T19:55:00+01:00", out: "2016-06-21 18:55:00 +0000 UTC"}, {in: "2016-06-21T19:55:00.799+01:00", out: "2016-06-21 18:55:00.799 +0000 UTC"}, + // yyyy-mm-ddThh:mm:ss-07 TZ truncated to 2 digits instead of 4 + {in: "2019-05-29T08:41-04", out: "2019-05-29 12:41:00 +0000 UTC"}, // yyyy-mm-ddThh:mm:ss-0700 {in: "2009-08-12T22:15:09-0700", out: "2009-08-13 05:15:09 +0000 UTC"}, {in: "2009-08-12T22:15:09-0300", out: "2009-08-13 01:15:09 +0000 UTC"}, @@ -376,8 +378,9 @@ var testInputs = []dateTest{ {in: "2016-06-21T19:55:00.799+0100", out: "2016-06-21 18:55:00.799 +0000 UTC"}, {in: "2016-06-21T19:55+0100", out: "2016-06-21 18:55:00 +0000 UTC"}, {in: "2016-06-21T19:55+0130", out: "2016-06-21 18:25:00 +0000 UTC"}, - // yyyy-mm-ddThh:mm:ss:000+0000 - {in: "2012-08-17T18:31:59.257+0100", out: "2012-08-17 17:31:59.257 +0000 UTC"}, // https://github.com/araddon/dateparse/issues/117 + // yyyy-mm-ddThh:mm:ss:000+0000 - weird format with additional colon in front of milliseconds + {in: "2012-08-17T18:31:59:257+0100", out: "2012-08-17 17:31:59.257 +0000 UTC"}, // https://github.com/araddon/dateparse/issues/117 + // yyyy-mm-ddThh:mm:ssZ {in: "2009-08-12T22:15Z", out: "2009-08-12 22:15:00 +0000 UTC"}, {in: "2009-08-12T22:15:09Z", out: "2009-08-12 22:15:09 +0000 UTC"}, @@ -526,6 +529,8 @@ func TestParseLayout(t *testing.T) { {in: `{"hello"}`, err: true}, {in: "2009-15-12T22:15Z", err: true}, {in: "5,000-9,999", err: true}, + // This 3 digit TZ offset (should be 2 or 4? is 3 a thing?) + {in: "2019-05-29T08:41-047", err: true}, // {in: "06/May/2008 15:04:05 -0700", out: "02/Jan/2006 15:04:05 -0700"}, {in: "06/May/2008:15:04:05 -0700", out: "02/Jan/2006:15:04:05 -0700"},