Skip to content

Commit

Permalink
Support times after yyyy.mm.dd dates
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
klondikedragon committed Dec 15, 2023
1 parent 23869f3 commit cc63421
Show file tree
Hide file tree
Showing 2 changed files with 83 additions and 5 deletions.
74 changes: 69 additions & 5 deletions parseany.go
Expand Up @@ -69,18 +69,21 @@ const (
dateDigitDashDigitDash
dateDigitDot
dateDigitDotDot
dateDigitDotDotWs
dateDigitDotDotT
dateDigitDotDotOffset
dateDigitSlash
dateDigitYearSlash
dateDigitSlashAlpha // 18
dateDigitSlashAlpha // 21
dateDigitColon
dateDigitChineseYear
dateDigitChineseYearWs
dateDigitWs
dateDigitWsMoYear // 23
dateDigitWsMoYear // 26
dateAlpha
dateAlphaWs
dateAlphaWsDigit
dateAlphaWsDigitMore // 27
dateAlphaWsDigitMore // 30
dateAlphaWsDigitMoreWs
dateAlphaWsDigitMoreWsYear
dateAlphaWsMonth
Expand All @@ -90,7 +93,7 @@ const (
dateAlphaWsMore
dateAlphaWsAtTime
dateAlphaWsAlpha
dateAlphaWsAlphaYearmaybe // 37
dateAlphaWsAlphaYearmaybe // 40
dateAlphaPeriodWsDigit
dateAlphaSlash
dateAlphaSlashDigit
Expand Down Expand Up @@ -924,8 +927,52 @@ iterRunes:
p.stateDate = dateDigitDotDot
}
}

case dateDigitDotDot:
// iterate all the way through
// dateYearDashDashT
// 2006.01.02T15:04:05Z07:00
// dateYearDashDashWs
// 2013.04.01 22:43:22
// dateYearDashDashOffset
// 2020.07.20+00:00
switch r {
case '+', '-':
p.offseti = i
p.daylen = i - p.dayi
p.stateDate = dateDigitDotDotOffset
if !p.setDay() {
return p, unknownErr(datestr)
}
case ' ':
p.daylen = i - p.dayi
p.stateDate = dateDigitDotDotWs
p.stateTime = timeStart
if !p.setDay() {
return p, unknownErr(datestr)
}
break iterRunes
case 'T':
p.daylen = i - p.dayi
p.stateDate = dateDigitDotDotT
p.stateTime = timeStart
if !p.setDay() {
return p, unknownErr(datestr)
}
break iterRunes
}

case dateDigitDotDotT:
// dateYearDashDashT
// 2006-01-02T15:04:05Z07:00
// 2020-08-17T17:00:00:000+0100

case dateDigitDotDotOffset:
// 2020-07-20+00:00
switch r {
case ':':
p.set(p.offseti, "-07:00")
}

case dateAlpha:
// dateAlphaWS
// Mon Jan _2 15:04:05 2006
Expand Down Expand Up @@ -2177,6 +2224,23 @@ iterRunes:
// 2018.09.30
return p, nil

case dateDigitDotDotWs:
// 2013.04.01
return p, nil

case dateDigitDotDotT:
return p, nil

case dateDigitDotDotOffset:
// 2020.07.20+00:00
switch len(p.datestr) - p.offseti {
case 5:
p.set(p.offseti, "-0700")
case 6:
p.set(p.offseti, "-07:00")
}
return p, nil

case dateDigitWsMoYear:
// 2 Jan 2018
// 2 Jan 18
Expand Down
14 changes: 14 additions & 0 deletions parseany_test.go
Expand Up @@ -647,6 +647,16 @@ var testInputs = []dateTest{
// https://github.com/araddon/dateparse/issues/158
{in: "Mon, 1 Dec 2008 14:48:22 GMT-07:00", out: "2008-12-01 21:48:22 +0000 UTC"},
{in: "Mon, 1 Dec 2008 14:48:22 UTC-07:00", out: "2008-12-01 21:48:22 +0000 UTC"},

// Fixes for bugs mentioned in https://github.com/araddon/dateparse/pull/134
{in: "2014.02.13", out: "2014-02-13 00:00:00 +0000 UTC"},
{in: "2014-02-13 00:00:00", out: "2014-02-13 00:00:00 +0000 UTC"},
{in: "2014.02.13 00:00:00", out: "2014-02-13 00:00:00 +0000 UTC"},
{in: "2014.02.13 08:33:44", out: "2014-02-13 08:33:44 +0000 UTC"},
{in: "2014.02.13T08:33:44", out: "2014-02-13 08:33:44 +0000 UTC"},
{in: "2014.02.13T08:33:44.555", out: "2014-02-13 08:33:44.555 +0000 UTC"},
{in: "2014.02.13T08:33:44.555 PM -0700 MST", out: "2014-02-14 03:33:44.555 +0000 UTC", zname: "MST"},
{in: "2014.02.13-0200", out: "2014-02-13 02:00:00 +0000 UTC"},
}

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

func TestParseErrors(t *testing.T) {
Expand Down

0 comments on commit cc63421

Please sign in to comment.