From aa9b62f2754df0bc490e715b186db7d55c971295 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=95=86=E8=AE=AF=E5=9C=A8=E7=BA=BF?= Date: Tue, 15 Apr 2014 23:27:08 +0800 Subject: [PATCH] update MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 商讯在线 --- engine.go | 40 ++++++++++++++++++++++++++++++++++++++++ session.go | 25 +++++++++---------------- statement.go | 11 +---------- table.go | 2 +- xorm.go | 8 ++++++-- 5 files changed, 57 insertions(+), 29 deletions(-) diff --git a/engine.go b/engine.go index 6f7c3a32..106f5b84 100644 --- a/engine.go +++ b/engine.go @@ -12,6 +12,7 @@ import ( "strconv" "strings" "sync" + "time" ) const ( @@ -71,6 +72,7 @@ type Engine struct { Logger io.Writer Cacher Cacher UseCache bool + TimeZone string } func (engine *Engine) SetMapper(mapper IMapper) { @@ -1071,3 +1073,41 @@ func (engine *Engine) Import(ddlPath string) ([]sql.Result, error) { } return results, lastError } + +func (engine *Engine) TZTime(t time.Time) (r time.Time) { + switch engine.TimeZone { + case "Local", "L": + r = t.Local() + case "UTC", "U": + fallthrough + default: + r = t.UTC() + } + return +} + +func (engine *Engine) NowTime(SQLTypeName string) interface{} { + t := time.Now() + return engine.FormatTime(SQLTypeName, t) +} + +func (engine *Engine) FormatTime(SQLTypeName string, t time.Time) (v interface{}) { + switch SQLTypeName { + case Time: + s := engine.TZTime(t).Format("2006-01-02 15:04:05") //time.RFC3339 + v = s[11:19] + case Date: + v = engine.TZTime(t).Format("2006-01-02") + case DateTime, TimeStamp: + v = engine.TZTime(t).Format("2006-01-02 15:04:05") + case TimeStampz: + if engine.dialect.DBType() == MSSQL { + v = engine.TZTime(t).Format("2006-01-02T15:04:05.9999999Z07:00") + } else { + v = engine.TZTime(t).Format(time.RFC3339Nano) + } + default: + v = engine.TZTime(t) + } + return +} diff --git a/session.go b/session.go index 2298e839..36625653 100644 --- a/session.go +++ b/session.go @@ -1807,7 +1807,7 @@ func (session *Session) innerInsertMulti(rowsSlicePtr interface{}) (int64, error } } if (col.IsCreated || col.IsUpdated) && session.Statement.UseAutoTime { - args = append(args, time.Now()) + args = append(args, session.Engine.NowTime(col.SQLType.Name)) } else { arg, err := session.value2Interface(col, fieldValue) if err != nil { @@ -1835,7 +1835,7 @@ func (session *Session) innerInsertMulti(rowsSlicePtr interface{}) (int64, error } } if (col.IsCreated || col.IsUpdated) && session.Statement.UseAutoTime { - args = append(args, time.Now()) + args = append(args, session.Engine.NowTime(col.SQLType.Name)) } else { arg, err := session.value2Interface(col, fieldValue) if err != nil { @@ -2401,20 +2401,13 @@ func (session *Session) value2Interface(col *Column, fieldValue reflect.Value) ( return nil, nil } } - if col.SQLType.Name == Time { - //s := fieldValue.Interface().(time.Time).Format("2006-01-02 15:04:05 -0700") - s := fieldValue.Interface().(time.Time).Format(time.RFC3339) - return s[11:19], nil - } else if col.SQLType.Name == Date { - return fieldValue.Interface().(time.Time).Format("2006-01-02"), nil - } else if col.SQLType.Name == TimeStampz { - if session.Engine.dialect.DBType() == MSSQL { - tf := t.Format("2006-01-02T15:04:05.9999999Z07:00") - return tf, nil - } - return fieldValue.Interface().(time.Time).Format(time.RFC3339Nano), nil + switch fieldValue.Interface().(type) { + case time.Time: + tf := session.Engine.FormatTime(col.SQLType.Name,fieldValue.Interface().(time.Time)) + return tf, nil + default: + return fieldValue.Interface(), nil } - return fieldValue.Interface(), nil } if fieldTable, ok := session.Engine.Tables[fieldValue.Type()]; ok { if len(fieldTable.PrimaryKeys) == 1 { @@ -2878,7 +2871,7 @@ func (session *Session) Update(bean interface{}, condiBean ...interface{}) (int6 if session.Statement.UseAutoTime && table.Updated != "" { colNames = append(colNames, session.Engine.Quote(table.Updated)+" = ?") - args = append(args, time.Now()) + args = append(args, session.Engine.NowTime(table.Columns[table.Updated].SQLType.Name)) } var condiColNames []string diff --git a/statement.go b/statement.go index 713e8637..88185303 100644 --- a/statement.go +++ b/statement.go @@ -332,16 +332,7 @@ func buildConditions(engine *Engine, table *Table, bean interface{}, if !requiredField && (t.IsZero() || !fieldValue.IsValid()) { continue } - var str string - if col.SQLType.Name == Time { - s := t.UTC().Format("2006-01-02 15:04:05") - val = s[11:19] - } else if col.SQLType.Name == Date { - str = t.Format("2006-01-02") - val = str - } else { - val = t - } + val = engine.FormatTime(col.SQLType.Name, t) } else { engine.autoMapType(fieldValue) if table, ok := engine.Tables[fieldValue.Type()]; ok { diff --git a/table.go b/table.go index 34cb0862..3e911ca2 100644 --- a/table.go +++ b/table.go @@ -456,7 +456,7 @@ func (table *Table) genCols(session *Session, bean interface{}, useCol bool, inc } if (col.IsCreated || col.IsUpdated) && session.Statement.UseAutoTime { - args = append(args, time.Now()) + args = append(args, session.Engine.NowTime(col.SQLType.Name)) } else if col.IsVersion && session.Statement.checkVersion { args = append(args, 1) } else { diff --git a/xorm.go b/xorm.go index 0a18d5e3..11028edf 100644 --- a/xorm.go +++ b/xorm.go @@ -20,8 +20,12 @@ func close(engine *Engine) { // new a db manager according to the parameter. Currently support four // drivers func NewEngine(driverName string, dataSourceName string) (*Engine, error) { - engine := &Engine{DriverName: driverName, - DataSourceName: dataSourceName, Filters: make([]Filter, 0)} + engine := &Engine{ + DriverName: driverName, + DataSourceName: dataSourceName, + Filters: make([]Filter, 0), + TimeZone: "UTC", + } engine.SetMapper(SnakeMapper{}) if driverName == SQLITE {