diff --git a/README.md b/README.md index d08d0dd..fe682dd 100644 --- a/README.md +++ b/README.md @@ -154,6 +154,8 @@ var examples = []string{ "2014-04", "2014", "2014-05-11 08:20:13,787", + // yyyy-mm-dd-07:00 + "2020-07-20+08:00", // mm.dd.yy "3.31.2014", "03.31.2014", @@ -302,6 +304,7 @@ func main() { | 2014-04 | 2014-04-01 00:00:00 +0000 UTC | | 2014 | 2014-01-01 00:00:00 +0000 UTC | | 2014-05-11 08:20:13,787 | 2014-05-11 08:20:13.787 +0000 UTC | +| 2020-07-20+08:00 | 2020-07-20 00:00:00 +0800 +0800 | | 3.31.2014 | 2014-03-31 00:00:00 +0000 UTC | | 03.31.2014 | 2014-03-31 00:00:00 +0000 UTC | | 08.21.71 | 1971-08-21 00:00:00 +0000 UTC | diff --git a/example/main.go b/example/main.go index 8dc6aa7..9896f04 100644 --- a/example/main.go +++ b/example/main.go @@ -111,6 +111,8 @@ var examples = []string{ "2014-04", "2014", "2014-05-11 08:20:13,787", + // yyyy-mm-dd-07:00 + "2020-07-20+08:00", // mm.dd.yy "3.31.2014", "03.31.2014", @@ -259,6 +261,7 @@ func main() { | 2014-04 | 2014-04-01 00:00:00 +0000 UTC | | 2014 | 2014-01-01 00:00:00 +0000 UTC | | 2014-05-11 08:20:13,787 | 2014-05-11 08:20:13.787 +0000 UTC | +| 2020-07-20+08:00 | 2020-07-20 00:00:00 +0800 +0800 | | 3.31.2014 | 2014-03-31 00:00:00 +0000 UTC | | 03.31.2014 | 2014-03-31 00:00:00 +0000 UTC | | 08.21.71 | 1971-08-21 00:00:00 +0000 UTC | diff --git a/parseany.go b/parseany.go index ecd69fa..a5c4053 100644 --- a/parseany.go +++ b/parseany.go @@ -61,35 +61,36 @@ const ( dateYearDashDash dateYearDashDashWs // 5 dateYearDashDashT + dateYearDashDashOffset dateDigitDash dateDigitDashAlpha - dateDigitDashAlphaDash - dateDigitDot // 10 + dateDigitDashAlphaDash // 10 + dateDigitDot dateDigitDotDot dateDigitSlash dateDigitYearSlash - dateDigitSlashAlpha - dateDigitColon // 15 + dateDigitSlashAlpha // 15 + dateDigitColon dateDigitChineseYear dateDigitChineseYearWs dateDigitWs - dateDigitWsMoYear - dateDigitWsMolong // 20 + dateDigitWsMoYear // 20 + dateDigitWsMolong dateAlpha dateAlphaWs dateAlphaWsDigit - dateAlphaWsDigitMore - dateAlphaWsDigitMoreWs // 25 + dateAlphaWsDigitMore // 25 + dateAlphaWsDigitMoreWs dateAlphaWsDigitMoreWsYear dateAlphaWsMonth dateAlphaWsDigitYearmaybe dateAlphaWsMonthMore - dateAlphaWsMonthSuffix // 30 + dateAlphaWsMonthSuffix dateAlphaWsMore dateAlphaWsAtTime dateAlphaWsAlpha - dateAlphaWsAlphaYearmaybe - dateAlphaPeriodWsDigit // 35 + dateAlphaWsAlphaYearmaybe // 35 + dateAlphaPeriodWsDigit dateWeekdayComma dateWeekdayAbbrevComma ) @@ -434,7 +435,14 @@ iterRunes: // 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 = dateYearDashDashOffset + p.setDay() case ' ': p.daylen = i - p.dayi p.stateDate = dateYearDashDashWs @@ -454,6 +462,15 @@ iterRunes: // 2006-01-02T15:04:05Z07:00 // 2020-08-17T17:00:00:000+0100 + case dateYearDashDashOffset: + // 2020-07-20+00:00 + switch r { + case ':': + p.set(p.offseti, "-07:00") + // case ' ': + // return nil, unknownErr(datestr) + } + case dateYearDashAlphaDash: // 2013-Feb-03 switch r { @@ -1777,6 +1794,16 @@ iterRunes: // 2006-01-2 return p, nil + case dateYearDashDashOffset: + /// 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 dateYearDashAlphaDash: // 2013-Feb-03 // 2013-Feb-3 diff --git a/parseany_test.go b/parseany_test.go index 377e915..ec36bc8 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("Thu, 17 Dec 2020 15:39:13 GMT") - assert.Equal(t, "2020-12-17 15:39:13 +0000 UTC", fmt.Sprintf("%v", ts.In(time.UTC))) + ts = MustParse("2020-07-20+08:00") + assert.Equal(t, "2020-07-19 16:00:00 +0000 UTC", fmt.Sprintf("%v", ts.In(time.UTC))) } type dateTest struct { @@ -236,6 +236,9 @@ var testInputs = []dateTest{ {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-4-2", out: "2014-04-02 00:00:00 +0000 UTC"}, + // yyyy-mm-dd-07:00 + {in: "2020-07-20+08:00", out: "2020-07-19 16:00:00 +0000 UTC"}, + {in: "2020-07-20+0800", out: "2020-07-19 16:00:00 +0000 UTC"}, // dd-mmm-yy {in: "28-Feb-02", out: "2002-02-28 00:00:00 +0000 UTC"}, {in: "15-Jan-18", out: "2018-01-15 00:00:00 +0000 UTC"},