From 89c03870c8c23fcc8c2d31b059195d3df4327a39 Mon Sep 17 00:00:00 2001 From: slene Date: Sat, 2 Nov 2013 00:51:53 +0800 Subject: [PATCH] orm fix sqlite3 time convert --- orm/db.go | 27 +++++++++------------------ orm/db_utils.go | 27 ++++++++++++++++++++++++++- 2 files changed, 35 insertions(+), 19 deletions(-) diff --git a/orm/db.go b/orm/db.go index d3b586cf..a5f6471a 100644 --- a/orm/db.go +++ b/orm/db.go @@ -97,11 +97,7 @@ func (d *dbBase) collectFieldValue(mi *modelInfo, fi *fieldInfo, ind reflect.Val case TypeDateField, TypeDateTimeField: value = field.Interface() if t, ok := value.(time.Time); ok { - if fi.fieldType == TypeDateField { - d.ins.TimeToDB(&t, DefaultTimeLoc) - } else { - d.ins.TimeToDB(&t, tz) - } + d.ins.TimeToDB(&t, tz) value = t } default: @@ -130,11 +126,7 @@ func (d *dbBase) collectFieldValue(mi *modelInfo, fi *fieldInfo, ind reflect.Val case TypeDateField, TypeDateTimeField: if fi.auto_now || fi.auto_now_add && insert { tnow := time.Now() - if fi.fieldType == TypeDateField { - d.ins.TimeToDB(&tnow, DefaultTimeLoc) - } else { - d.ins.TimeToDB(&tnow, tz) - } + d.ins.TimeToDB(&tnow, tz) value = tnow if fi.isFielder { f := field.Addr().Interface().(Fielder) @@ -895,18 +887,17 @@ setValue: t time.Time err error ) - if fi.fieldType == TypeDateField { + if len(s) >= 19 { + s = s[:19] + t, err = time.ParseInLocation(format_DateTime, s, tz) + } else { if len(s) > 10 { s = s[:10] } - t, err = time.ParseInLocation(format_Date, s, DefaultTimeLoc) - } else { - if len(s) > 19 { - s = s[:19] - } - t, err = time.ParseInLocation(format_DateTime, s, tz) - t = t.In(DefaultTimeLoc) + t, err = time.ParseInLocation(format_Date, s, tz) } + t = t.In(DefaultTimeLoc) + if err != nil && s != "0000-00-00" && s != "0000-00-00 00:00:00" { tErr = err goto end diff --git a/orm/db_utils.go b/orm/db_utils.go index af242516..23140ab8 100644 --- a/orm/db_utils.go +++ b/orm/db_utils.go @@ -50,9 +50,34 @@ outFor: switch v := arg.(type) { case []byte: + case string: + if fi != nil { + if fi.fieldType == TypeDateField || fi.fieldType == TypeDateTimeField { + var t time.Time + var err error + if len(v) >= 19 { + s := v[:19] + t, err = time.ParseInLocation(format_DateTime, s, DefaultTimeLoc) + } else { + s := v + if len(v) > 10 { + s = v[:10] + } + t, err = time.ParseInLocation(format_Date, s, DefaultTimeLoc) + } + if err == nil { + if fi.fieldType == TypeDateField { + v = t.In(tz).Format(format_Date) + } else { + v = t.In(tz).Format(format_DateTime) + } + } + } + } + arg = v case time.Time: if fi != nil && fi.fieldType == TypeDateField { - arg = v.In(DefaultTimeLoc).Format(format_Date) + arg = v.In(tz).Format(format_Date) } else { arg = v.In(tz).Format(format_DateTime) }