Skip to content

Commit cc63421

Browse files
Support times after yyyy.mm.dd dates
Fix for this bug mentioned in araddon#134 Also, the other cases mentioned in this PR are not valid formats, so add them to the TestParseErrors test, to document that this is expected.
1 parent 23869f3 commit cc63421

File tree

2 files changed

+83
-5
lines changed

2 files changed

+83
-5
lines changed

parseany.go

Lines changed: 69 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -69,18 +69,21 @@ const (
6969
dateDigitDashDigitDash
7070
dateDigitDot
7171
dateDigitDotDot
72+
dateDigitDotDotWs
73+
dateDigitDotDotT
74+
dateDigitDotDotOffset
7275
dateDigitSlash
7376
dateDigitYearSlash
74-
dateDigitSlashAlpha // 18
77+
dateDigitSlashAlpha // 21
7578
dateDigitColon
7679
dateDigitChineseYear
7780
dateDigitChineseYearWs
7881
dateDigitWs
79-
dateDigitWsMoYear // 23
82+
dateDigitWsMoYear // 26
8083
dateAlpha
8184
dateAlphaWs
8285
dateAlphaWsDigit
83-
dateAlphaWsDigitMore // 27
86+
dateAlphaWsDigitMore // 30
8487
dateAlphaWsDigitMoreWs
8588
dateAlphaWsDigitMoreWsYear
8689
dateAlphaWsMonth
@@ -90,7 +93,7 @@ const (
9093
dateAlphaWsMore
9194
dateAlphaWsAtTime
9295
dateAlphaWsAlpha
93-
dateAlphaWsAlphaYearmaybe // 37
96+
dateAlphaWsAlphaYearmaybe // 40
9497
dateAlphaPeriodWsDigit
9598
dateAlphaSlash
9699
dateAlphaSlashDigit
@@ -924,8 +927,52 @@ iterRunes:
924927
p.stateDate = dateDigitDotDot
925928
}
926929
}
930+
927931
case dateDigitDotDot:
928-
// iterate all the way through
932+
// dateYearDashDashT
933+
// 2006.01.02T15:04:05Z07:00
934+
// dateYearDashDashWs
935+
// 2013.04.01 22:43:22
936+
// dateYearDashDashOffset
937+
// 2020.07.20+00:00
938+
switch r {
939+
case '+', '-':
940+
p.offseti = i
941+
p.daylen = i - p.dayi
942+
p.stateDate = dateDigitDotDotOffset
943+
if !p.setDay() {
944+
return p, unknownErr(datestr)
945+
}
946+
case ' ':
947+
p.daylen = i - p.dayi
948+
p.stateDate = dateDigitDotDotWs
949+
p.stateTime = timeStart
950+
if !p.setDay() {
951+
return p, unknownErr(datestr)
952+
}
953+
break iterRunes
954+
case 'T':
955+
p.daylen = i - p.dayi
956+
p.stateDate = dateDigitDotDotT
957+
p.stateTime = timeStart
958+
if !p.setDay() {
959+
return p, unknownErr(datestr)
960+
}
961+
break iterRunes
962+
}
963+
964+
case dateDigitDotDotT:
965+
// dateYearDashDashT
966+
// 2006-01-02T15:04:05Z07:00
967+
// 2020-08-17T17:00:00:000+0100
968+
969+
case dateDigitDotDotOffset:
970+
// 2020-07-20+00:00
971+
switch r {
972+
case ':':
973+
p.set(p.offseti, "-07:00")
974+
}
975+
929976
case dateAlpha:
930977
// dateAlphaWS
931978
// Mon Jan _2 15:04:05 2006
@@ -2177,6 +2224,23 @@ iterRunes:
21772224
// 2018.09.30
21782225
return p, nil
21792226

2227+
case dateDigitDotDotWs:
2228+
// 2013.04.01
2229+
return p, nil
2230+
2231+
case dateDigitDotDotT:
2232+
return p, nil
2233+
2234+
case dateDigitDotDotOffset:
2235+
// 2020.07.20+00:00
2236+
switch len(p.datestr) - p.offseti {
2237+
case 5:
2238+
p.set(p.offseti, "-0700")
2239+
case 6:
2240+
p.set(p.offseti, "-07:00")
2241+
}
2242+
return p, nil
2243+
21802244
case dateDigitWsMoYear:
21812245
// 2 Jan 2018
21822246
// 2 Jan 18

parseany_test.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -647,6 +647,16 @@ var testInputs = []dateTest{
647647
// https://github.com/araddon/dateparse/issues/158
648648
{in: "Mon, 1 Dec 2008 14:48:22 GMT-07:00", out: "2008-12-01 21:48:22 +0000 UTC"},
649649
{in: "Mon, 1 Dec 2008 14:48:22 UTC-07:00", out: "2008-12-01 21:48:22 +0000 UTC"},
650+
651+
// Fixes for bugs mentioned in https://github.com/araddon/dateparse/pull/134
652+
{in: "2014.02.13", out: "2014-02-13 00:00:00 +0000 UTC"},
653+
{in: "2014-02-13 00:00:00", out: "2014-02-13 00:00:00 +0000 UTC"},
654+
{in: "2014.02.13 00:00:00", out: "2014-02-13 00:00:00 +0000 UTC"},
655+
{in: "2014.02.13 08:33:44", out: "2014-02-13 08:33:44 +0000 UTC"},
656+
{in: "2014.02.13T08:33:44", out: "2014-02-13 08:33:44 +0000 UTC"},
657+
{in: "2014.02.13T08:33:44.555", out: "2014-02-13 08:33:44.555 +0000 UTC"},
658+
{in: "2014.02.13T08:33:44.555 PM -0700 MST", out: "2014-02-14 03:33:44.555 +0000 UTC", zname: "MST"},
659+
{in: "2014.02.13-0200", out: "2014-02-13 02:00:00 +0000 UTC"},
650660
}
651661

652662
func TestParse(t *testing.T) {
@@ -802,6 +812,10 @@ var testParseErrors = []dateTest{
802812
{in: "2018-09-30 08:09:13.123AM am", err: true},
803813
{in: "2018-09-30 08:09:13.123 am AM", err: true},
804814
{in: "2018-09-30 08:09:13.123 AMDT am", err: true},
815+
// https://github.com/araddon/dateparse/pull/134
816+
{in: "2014-02-13 00:00:00 utc", err: true}, // lowercase timezones are not valid
817+
{in: "2014-02-13t00:00:00.0z", err: true}, // lowercase 't' separator is not supported
818+
{in: "2014-02-13T00:00:00.0z", err: true}, // lowercase 'z' zulu timezone indicator not a valid format
805819
}
806820

807821
func TestParseErrors(t *testing.T) {

0 commit comments

Comments
 (0)