Change to parse dashes

This commit is contained in:
Baroukh Ovadia 2023-07-25 13:11:50 -07:00
parent 6b43995a97
commit 09b968c97f
2 changed files with 78 additions and 4 deletions

View File

@ -296,7 +296,38 @@ iterRunes:
p.moi = i + 1 p.moi = i + 1
p.set(0, "2006") p.set(0, "2006")
} else { } else {
// Either Ambiguous dd/mm vs mm/dd OR dd/month/yy
// 08-May-2005
// 03-31-2005
// 31-03-2005
if i+2 < len(p.datestr) && unicode.IsLetter(rune(datestr[i+1])) {
// 08-May-2005
p.stateDate = dateDigitDashAlpha
p.moi = i + 1
p.daylen = 2
p.dayi = 0
p.setDay()
continue
}
p.stateDate = dateDigitDash p.stateDate = dateDigitDash
// Ambiguous dd-mm vs mm-dd the bane of date-parsing
// 03-31-2005
// 31-03-2005
p.ambiguousMD = true
if p.preferMonthFirst {
if p.molen == 0 {
// 03-31-2005
p.molen = i
p.setMonth()
p.dayi = i + 1
}
} else {
if p.daylen == 0 {
p.daylen = i
p.setDay()
p.moi = i + 1
}
}
} }
case '/': case '/':
// 08/May/2005 // 08/May/2005
@ -456,7 +487,6 @@ iterRunes:
p.setDay() p.setDay()
break iterRunes break iterRunes
} }
case dateYearDashDashT: case dateYearDashDashT:
// dateYearDashDashT // dateYearDashDashT
// 2006-01-02T15:04:05Z07:00 // 2006-01-02T15:04:05Z07:00
@ -479,6 +509,7 @@ iterRunes:
p.set(p.moi, "Jan") p.set(p.moi, "Jan")
p.dayi = i + 1 p.dayi = i + 1
} }
case dateDigitDash: case dateDigitDash:
// 13-Feb-03 // 13-Feb-03
// 29-Jun-2016 // 29-Jun-2016
@ -486,8 +517,43 @@ iterRunes:
p.stateDate = dateDigitDashAlpha p.stateDate = dateDigitDashAlpha
p.moi = i p.moi = i
} else { } else {
return nil, unknownErr(datestr) // 03-19-2012 10:11:59
// 04-2-2014 03:00:37
// 3-1-2012 10:11:59
// 4-8-2014 22:05
// 3-1-2014
// 10-13-2014
// 01-02-2006
// 1-2-06
switch r {
case '-':
// This is the 2nd / so now we should know start pts of all of the dd, mm, yy
if p.preferMonthFirst {
if p.daylen == 0 {
p.daylen = i - p.dayi
p.setDay()
p.yeari = i + 1
}
} else {
if p.molen == 0 {
p.molen = i - p.moi
p.setMonth()
p.yeari = i + 1
}
}
// Note no break, we are going to pass by and re-enter this dateDigitSlash
// and look for ending (space) or not (just date)
case ' ':
p.stateTime = timeStart
if p.yearlen == 0 {
p.yearlen = i - p.yeari
p.setYear()
}
break iterRunes
}
//return nil, unknownErr(datestr)
} }
case dateDigitDashAlpha: case dateDigitDashAlpha:
// 13-Feb-03 // 13-Feb-03
// 28-Feb-03 // 28-Feb-03
@ -1845,7 +1911,6 @@ iterRunes:
} }
return p, nil return p, nil
case dateDigitDot: case dateDigitDot:
// 2014.05 // 2014.05
p.molen = i - p.moi p.molen = i - p.moi
@ -1907,6 +1972,11 @@ iterRunes:
case dateAlphaWsDigitYearmaybe: case dateAlphaWsDigitYearmaybe:
return p, nil return p, nil
case dateDigitDash:
// 3/1/2014
// 10/13/2014
// 01/02/2006
return p, nil
case dateDigitSlash: case dateDigitSlash:
// 3/1/2014 // 3/1/2014
// 10/13/2014 // 10/13/2014

View File

@ -232,6 +232,10 @@ var testInputs = []dateTest{
// dd/mon/yyy hh:mm:ss tz // dd/mon/yyy hh:mm:ss tz
{in: "06/May/2008:08:11:17 -0700", out: "2008-05-06 15:11:17 +0000 UTC"}, {in: "06/May/2008:08:11:17 -0700", out: "2008-05-06 15:11:17 +0000 UTC"},
{in: "30/May/2008:08:11:17 -0700", out: "2008-05-30 15:11:17 +0000 UTC"}, {in: "30/May/2008:08:11:17 -0700", out: "2008-05-30 15:11:17 +0000 UTC"},
// mm-dd-yyyy
{in: "04-02-2014", out: "2014-04-02 00:00:00 +0000 UTC"},
{in: "03-31-2014", out: "2014-03-31 00:00:00 +0000 UTC"},
{in: "4-2-2014", out: "2014-04-02 00:00:00 +0000 UTC"},
// yyyy-mm-dd // yyyy-mm-dd
{in: "2014-04-02", out: "2014-04-02 00:00:00 +0000 UTC"}, {in: "2014-04-02", out: "2014-04-02 00:00:00 +0000 UTC"},
{in: "2014-03-31", out: "2014-03-31 00:00:00 +0000 UTC"}, {in: "2014-03-31", out: "2014-03-31 00:00:00 +0000 UTC"},
@ -511,7 +515,7 @@ var testParseErrors = []dateTest{
{in: "oct.-7-1970", err: true}, {in: "oct.-7-1970", err: true},
{in: "septe. 7, 1970", err: true}, {in: "septe. 7, 1970", err: true},
{in: "SeptemberRR 7th, 1970", err: true}, {in: "SeptemberRR 7th, 1970", err: true},
{in: "29-06-2016", err: true}, // {in: "29-06-2016", err: true},
// this is just testing the empty space up front // this is just testing the empty space up front
{in: " 2018-01-02 17:08:09 -07:00", err: true}, {in: " 2018-01-02 17:08:09 -07:00", err: true},
} }