Skip to content

Commit 301ffee

Browse files
Add support for mon/dd/yyyy (Oct/31/1970)
1 parent 49f9259 commit 301ffee

File tree

2 files changed

+101
-1
lines changed

2 files changed

+101
-1
lines changed

parseany.go

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,9 @@ const (
9090
dateAlphaWsAlpha
9191
dateAlphaWsAlphaYearmaybe // 34
9292
dateAlphaPeriodWsDigit
93+
dateAlphaSlash
94+
dateAlphaSlashDigit
95+
dateAlphaSlashDigitSlash
9396
dateWeekdayComma
9497
dateWeekdayAbbrevComma
9598
)
@@ -855,6 +858,14 @@ iterRunes:
855858
//
856859
// dateAlphaPeriodWsDigit
857860
// oct. 1, 1970
861+
// dateAlphaSlash
862+
// dateAlphaSlashDigit
863+
// dateAlphaSlashDigitSlash
864+
// Oct/ 7/1970
865+
// Oct/07/1970
866+
// February/ 7/1970
867+
// February/07/1970
868+
//
858869
// dateWeekdayComma
859870
// Monday, 02 Jan 2006 15:04:05 MST
860871
// Monday, 02-Jan-06 15:04:05 MST
@@ -937,6 +948,30 @@ iterRunes:
937948
} else {
938949
return p, unknownErr(datestr)
939950
}
951+
case r == '/':
952+
// X
953+
// Oct/ 7/1970
954+
// Oct/07/1970
955+
// X
956+
// February/ 7/1970
957+
// February/07/1970
958+
// Must be a valid short or long month
959+
if i == 3 {
960+
p.moi = 0
961+
p.molen = i - p.moi
962+
p.set(p.moi, "Jan")
963+
p.stateDate = dateAlphaSlash
964+
} else {
965+
possibleFullMonth := strings.ToLower(p.datestr[:i])
966+
if i > 3 && isMonthFull(possibleFullMonth) {
967+
p.moi = 0
968+
p.molen = i - p.moi
969+
p.fullMonth = possibleFullMonth
970+
p.stateDate = dateAlphaSlash
971+
} else {
972+
return p, unknownErr(datestr)
973+
}
974+
}
940975
}
941976

942977
case dateAlphaWs:
@@ -1183,6 +1218,53 @@ iterRunes:
11831218
default:
11841219
return p, unknownErr(datestr)
11851220
}
1221+
1222+
case dateAlphaSlash:
1223+
// Oct/ 7/1970
1224+
// February/07/1970
1225+
switch {
1226+
case r == ' ':
1227+
// continue
1228+
case unicode.IsDigit(r):
1229+
p.stateDate = dateAlphaSlashDigit
1230+
p.dayi = i
1231+
default:
1232+
return p, unknownErr(datestr)
1233+
}
1234+
1235+
case dateAlphaSlashDigit:
1236+
// dateAlphaSlash:
1237+
// dateAlphaSlashDigit:
1238+
// dateAlphaSlashDigitSlash:
1239+
// Oct/ 7/1970
1240+
// Oct/07/1970
1241+
// February/ 7/1970
1242+
// February/07/1970
1243+
switch {
1244+
case r == '/':
1245+
p.yeari = i + 1
1246+
p.daylen = i - p.dayi
1247+
if !p.setDay() {
1248+
return p, unknownErr(datestr)
1249+
}
1250+
p.stateDate = dateAlphaSlashDigitSlash
1251+
case unicode.IsDigit(r):
1252+
// continue
1253+
default:
1254+
return p, unknownErr(datestr)
1255+
}
1256+
1257+
case dateAlphaSlashDigitSlash:
1258+
switch {
1259+
case unicode.IsDigit(r):
1260+
// continue
1261+
case r == ' ':
1262+
p.stateTime = timeStart
1263+
break iterRunes
1264+
default:
1265+
return p, unknownErr(datestr)
1266+
}
1267+
11861268
case dateWeekdayComma:
11871269
// Monday, 02 Jan 2006 15:04:05 MST
11881270
// Monday, 02 Jan 2006 15:04:05 -0700
@@ -2044,6 +2126,11 @@ iterRunes:
20442126
p.setEntireFormat([]byte("2006年01月02日 15:04:05"))
20452127
return p, nil
20462128

2129+
case dateAlphaSlashDigitSlash:
2130+
// Oct/ 7/1970
2131+
// February/07/1970
2132+
return p, nil
2133+
20472134
case dateWeekdayComma:
20482135
// Monday, 02 Jan 2006 15:04:05 -0700
20492136
// Monday, 02 Jan 2006 15:04:05 +0100
@@ -2381,6 +2468,9 @@ func isDay(alpha string) bool {
23812468
return false
23822469
}
23832470
func isMonthFull(alpha string) bool {
2471+
if len(alpha) > len("september") {
2472+
return false
2473+
}
23842474
for _, month := range months {
23852475
if alpha == month {
23862476
return true

parseany_test.go

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -304,9 +304,19 @@ var testInputs = []dateTest{
304304
// 112.195.209.90 - - [20/Feb/2018:12:12:14 +0800] "GET / HTTP/1.1" 200 190 "-" "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Mobile Safari/537.36" "-"
305305
{in: "06/May/2008:08:11:17 -0700", out: "2008-05-06 15:11:17 +0000 UTC"},
306306
{in: "30/May/2008:08:11:17 -0700", out: "2008-05-30 15:11:17 +0000 UTC"},
307-
// dd/mon/yyy hh:mm:ss tz
307+
// dd/mon/yyyy hh:mm:ss tz
308308
{in: "06/May/2008:08:11:17 -0700", out: "2008-05-06 15:11:17 +0000 UTC"},
309309
{in: "30/May/2008:08:11:17 -0700", out: "2008-05-30 15:11:17 +0000 UTC"},
310+
// mon/dd/yyyy
311+
{in: "Oct/ 7/1970", out: "1970-10-07 00:00:00 +0000 UTC"},
312+
{in: "Oct/31/1970", out: "1970-10-31 00:00:00 +0000 UTC"},
313+
{in: "Oct/03/1970", out: "1970-10-03 00:00:00 +0000 UTC"},
314+
{in: "Oct/03/1970 22:33:44", out: "1970-10-03 22:33:44 +0000 UTC"},
315+
{in: "February/ 7/1970", out: "1970-02-07 00:00:00 +0000 UTC"},
316+
{in: "February/27/1970", out: "1970-02-27 00:00:00 +0000 UTC"},
317+
{in: "February/03/1970", out: "1970-02-03 00:00:00 +0000 UTC"},
318+
{in: "February/03/1970 22:33:44.555", out: "1970-02-03 22:33:44.555 +0000 UTC"},
319+
{in: "February/03/1970 11:33:44.555 PM PST", out: "1970-02-03 23:33:44.555 +0000 UTC", zname: "PST"},
310320
// yyyy-mm-dd
311321
{in: "2014-04-02", out: "2014-04-02 00:00:00 +0000 UTC"},
312322
{in: "2014-03-31", out: "2014-03-31 00:00:00 +0000 UTC"},

0 commit comments

Comments
 (0)