From 9bbbf4491a9de5e065c1ae6bfa7d850572ab80e8 Mon Sep 17 00:00:00 2001 From: Tobie Morgan Hitchcock Date: Wed, 14 Sep 2016 21:57:42 +0100 Subject: [PATCH] Ensure parsed times are stored in UTC --- sql/scanner.go | 16 ++++++++++++---- sql/sql.go | 32 ++++++++++++++++++++++++++++++++ sql/util.go | 2 +- 3 files changed, 45 insertions(+), 5 deletions(-) create mode 100644 sql/sql.go diff --git a/sql/scanner.go b/sql/scanner.go index 4daed2e2..d6409bba 100644 --- a/sql/scanner.go +++ b/sql/scanner.go @@ -593,12 +593,20 @@ func (s *Scanner) scanString(chp ...rune) (tok Token, lit string, val interface{ return DURATION, buf.String(), val } - if val, err := time.Parse("2006-01-02", buf.String()); err == nil { - return DATE, buf.String(), val + if val, err := time.Parse(RFCDate, buf.String()); err == nil { + return DATE, buf.String(), val.UTC() } - if val, err := time.Parse(time.RFC3339, buf.String()); err == nil { - return TIME, buf.String(), val + if val, err := time.Parse(RFCTime, buf.String()); err == nil { + return TIME, buf.String(), val.UTC() + } + + if val, err := time.Parse(RFCNorm, buf.String()); err == nil { + return TIME, buf.String(), val.UTC() + } + + if val, err := time.Parse(RFCText, buf.String()); err == nil { + return TIME, buf.String(), val.UTC() } return tok, buf.String(), val diff --git a/sql/sql.go b/sql/sql.go new file mode 100644 index 00000000..358bea94 --- /dev/null +++ b/sql/sql.go @@ -0,0 +1,32 @@ +// Copyright © 2016 Abcum Ltd +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package sql + +import ( + "time" +) + +const ( + // Parsing format for date times + RFCDate = "2006-01-02" + // Parsing format for normal times + RFCNorm = time.RFC1123 + // Parsing format for json date times + RFCTime = time.RFC3339 + // Parsing format for json nanosecond times + RFCNano = time.RFC3339Nano + // Parsing format for readable text format date times + RFCText = "2006-01-02 15:04:05.999999999 -0700 MST" +) diff --git a/sql/util.go b/sql/util.go index 5159994d..6537032a 100644 --- a/sql/util.go +++ b/sql/util.go @@ -109,7 +109,7 @@ func (p *Parser) declare(tok Token, lit string) (interface{}, error) { return &Table{lit}, nil case NOW: - return time.Now(), nil + return time.Now().UTC(), nil case DATE: return time.Parse("2006-01-02", lit)