From e4b687858a5dccb3cf50b3ac381c0efc586a47aa Mon Sep 17 00:00:00 2001 From: qiuyesuifeng Date: Thu, 22 Oct 2015 13:17:48 +0800 Subject: [PATCH] mysql: update parseDatetime format. --- mysql/time.go | 38 ++++++++++++++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/mysql/time.go b/mysql/time.go index 7e094a5625..612284dee0 100644 --- a/mysql/time.go +++ b/mysql/time.go @@ -310,14 +310,41 @@ func (t Time) RoundFrac(fsp int) (Time, error) { return Time{Time: nt, Type: t.Type, Fsp: fsp}, nil } +func parseDateFromat(format string) []string { + format = strings.TrimSpace(format) + + start := 0 + seps := []string{} + for i := 0; i < len(format); i++ { + // Date fromat must start and end with number. + if i == 0 || i == len(format)-1 { + if !unicode.IsNumber(rune(format[i])) { + return nil + } + + continue + } + + // Sep can be only one none-number char. + if !unicode.IsNumber(rune(format[i])) { + if !unicode.IsNumber(rune(format[i-1])) { + return nil + } + + seps = append(seps, format[start:i]) + start = i + 1 + } + + } + + seps = append(seps, format[start:]) + return seps +} + func parseDatetime(str string, fsp int) (Time, error) { // Try to split str with delimiter. // TODO: only punctuation can be the delimiter for date parts or time parts. // But only space and T can be the delimiter between the date and time part. - seps := strings.FieldsFunc(str, func(c rune) bool { - return !unicode.IsNumber(c) - }) - var ( year int month int @@ -330,6 +357,9 @@ func parseDatetime(str string, fsp int) (Time, error) { err error ) + + seps := parseDateFromat(str) + switch len(seps) { case 1: // No delimiter.