diff options
Diffstat (limited to 'vendor/github.com/uptrace/bun/internal/time.go')
-rw-r--r-- | vendor/github.com/uptrace/bun/internal/time.go | 54 |
1 files changed, 37 insertions, 17 deletions
diff --git a/vendor/github.com/uptrace/bun/internal/time.go b/vendor/github.com/uptrace/bun/internal/time.go index e4e0804b0..2cb69b46a 100644 --- a/vendor/github.com/uptrace/bun/internal/time.go +++ b/vendor/github.com/uptrace/bun/internal/time.go @@ -8,34 +8,54 @@ import ( const ( dateFormat = "2006-01-02" timeFormat = "15:04:05.999999999" + timetzFormat1 = "15:04:05.999999999-07:00:00" + timetzFormat2 = "15:04:05.999999999-07:00" + timetzFormat3 = "15:04:05.999999999-07" timestampFormat = "2006-01-02 15:04:05.999999999" - timestamptzFormat = "2006-01-02 15:04:05.999999999-07:00:00" + timestamptzFormat1 = "2006-01-02 15:04:05.999999999-07:00:00" timestamptzFormat2 = "2006-01-02 15:04:05.999999999-07:00" timestamptzFormat3 = "2006-01-02 15:04:05.999999999-07" ) func ParseTime(s string) (time.Time, error) { - switch l := len(s); { - case l < len("15:04:05"): - return time.Time{}, fmt.Errorf("bun: can't parse time=%q", s) - case l <= len(timeFormat): - if s[2] == ':' { - return time.ParseInLocation(timeFormat, s, time.UTC) - } - return time.ParseInLocation(dateFormat, s, time.UTC) - default: - if s[10] == 'T' { + l := len(s) + + if l >= len("2006-01-02 15:04:05") { + switch s[10] { + case ' ': + if c := s[l-6]; c == '+' || c == '-' { + return time.Parse(timestamptzFormat2, s) + } + if c := s[l-3]; c == '+' || c == '-' { + return time.Parse(timestamptzFormat3, s) + } + if c := s[l-9]; c == '+' || c == '-' { + return time.Parse(timestamptzFormat1, s) + } + return time.ParseInLocation(timestampFormat, s, time.UTC) + case 'T': return time.Parse(time.RFC3339Nano, s) } - if c := s[l-9]; c == '+' || c == '-' { - return time.Parse(timestamptzFormat, s) - } + } + + if l >= len("15:04:05-07") { if c := s[l-6]; c == '+' || c == '-' { - return time.Parse(timestamptzFormat2, s) + return time.Parse(timetzFormat2, s) } if c := s[l-3]; c == '+' || c == '-' { - return time.Parse(timestamptzFormat3, s) + return time.Parse(timetzFormat3, s) } - return time.ParseInLocation(timestampFormat, s, time.UTC) + if c := s[l-9]; c == '+' || c == '-' { + return time.Parse(timetzFormat1, s) + } + } + + if l < len("15:04:05") { + return time.Time{}, fmt.Errorf("bun: can't parse time=%q", s) + } + + if s[2] == ':' { + return time.ParseInLocation(timeFormat, s, time.UTC) } + return time.ParseInLocation(dateFormat, s, time.UTC) } |