From a0866dbc9d1908b57ca614fc11c962673003af0a Mon Sep 17 00:00:00 2001 From: Jason Newman Date: Wed, 30 Aug 2017 10:39:46 -0600 Subject: [PATCH] Add support for BC dates Existing tests check for support for BC datetimes, adds support for BC dates. --- encode.go | 12 ++++++++++-- encode_test.go | 9 +++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/encode.go b/encode.go index 88a322cd..3b0d365f 100644 --- a/encode.go +++ b/encode.go @@ -367,8 +367,15 @@ func ParseTimestamp(currentLocation *time.Location, str string) (time.Time, erro timeSep := daySep + 3 day := p.mustAtoi(str, daySep+1, timeSep) + minLen := monSep + len("01-01") + 1 + + isBC := strings.HasSuffix(str, " BC") + if isBC { + minLen += 3 + } + var hour, minute, second int - if len(str) > monSep+len("01-01")+1 { + if len(str) > minLen { p.expect(str, ' ', timeSep) minSep := timeSep + 3 p.expect(str, ':', minSep) @@ -424,7 +431,8 @@ func ParseTimestamp(currentLocation *time.Location, str string) (time.Time, erro tzOff = tzSign * ((tzHours * 60 * 60) + (tzMin * 60) + tzSec) } var isoYear int - if remainderIdx+3 <= len(str) && str[remainderIdx:remainderIdx+3] == " BC" { + + if isBC { isoYear = 1 - year remainderIdx += 3 } else { diff --git a/encode_test.go b/encode_test.go index 3a0f7286..837d45be 100644 --- a/encode_test.go +++ b/encode_test.go @@ -37,6 +37,8 @@ var timeTests = []struct { }{ {"22001-02-03", time.Date(22001, time.February, 3, 0, 0, 0, 0, time.FixedZone("", 0))}, {"2001-02-03", time.Date(2001, time.February, 3, 0, 0, 0, 0, time.FixedZone("", 0))}, + {"0001-12-31 BC", time.Date(0, time.December, 31, 0, 0, 0, 0, time.FixedZone("", 0))}, + {"2001-02-03 BC", time.Date(-2000, time.February, 3, 0, 0, 0, 0, time.FixedZone("", 0))}, {"2001-02-03 04:05:06", time.Date(2001, time.February, 3, 4, 5, 6, 0, time.FixedZone("", 0))}, {"2001-02-03 04:05:06.000001", time.Date(2001, time.February, 3, 4, 5, 6, 1000, time.FixedZone("", 0))}, {"2001-02-03 04:05:06.00001", time.Date(2001, time.February, 3, 4, 5, 6, 10000, time.FixedZone("", 0))}, @@ -86,15 +88,22 @@ func TestParseTs(t *testing.T) { } var timeErrorTests = []string{ + "BC", + " BC", "2001", "2001-2-03", "2001-02-3", "2001-02-03 ", + "2001-02-03 B", "2001-02-03 04", "2001-02-03 04:", "2001-02-03 04:05", + "2001-02-03 04:05 B", + "2001-02-03 04:05 BC", "2001-02-03 04:05:", "2001-02-03 04:05:6", + "2001-02-03 04:05:06 B", + "2001-02-03 04:05:06BC", "2001-02-03 04:05:06.123 B", }