From f114f7874303d249b2956c894b1a90b042430acf Mon Sep 17 00:00:00 2001 From: Unknwon Date: Thu, 20 Aug 2015 00:56:12 +0800 Subject: [PATCH] fix timezone! --- models/action.go | 3 +-- models/issue.go | 6 ++---- models/models.go | 21 +++++++++++++++++++++ 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/models/action.go b/models/action.go index 2c08eebbd..2beb42e57 100644 --- a/models/action.go +++ b/models/action.go @@ -82,8 +82,7 @@ type Action struct { func (a *Action) AfterSet(colName string, _ xorm.Cell) { switch colName { case "created": - now := time.Now() - a.Created = a.Created.Add(now.Sub(now.UTC())) + a.Created = regulateTimeZone(a.Created) } } diff --git a/models/issue.go b/models/issue.go index 5e5c79c2e..d8c4809f1 100644 --- a/models/issue.go +++ b/models/issue.go @@ -93,8 +93,7 @@ func (i *Issue) AfterSet(colName string, _ xorm.Cell) { log.Error(3, "GetUserByID[%d]: %v", i.ID, err) } case "created": - now := time.Now() - i.Created = i.Created.Add(now.Sub(now.UTC())) + i.Created = regulateTimeZone(i.Created) } } @@ -1360,8 +1359,7 @@ func (c *Comment) AfterSet(colName string, _ xorm.Cell) { } } case "created": - now := time.Now() - c.Created = c.Created.Add(now.Sub(now.UTC())) + c.Created = regulateTimeZone(c.Created) } } diff --git a/models/models.go b/models/models.go index e06d5cf88..7d02bb956 100644 --- a/models/models.go +++ b/models/models.go @@ -10,7 +10,9 @@ import ( "os" "path" "strings" + "time" + "github.com/Unknwon/com" _ "github.com/go-sql-driver/mysql" "github.com/go-xorm/core" "github.com/go-xorm/xorm" @@ -40,6 +42,25 @@ func sessionRelease(sess *xorm.Session) { sess.Close() } +// Note: get back time.Time from database Go sees it at UTC where they are really Local. +// So this function makes correct timezone offset. +func regulateTimeZone(t time.Time) time.Time { + if setting.UseSQLite3 { + return t + } + + zone := t.Local().Format("-0700") + if len(zone) != 5 { + return t + } + offset := com.StrTo(zone[2:3]).MustInt() + + if zone[0] == '-' { + return t.Add(time.Duration(offset) * time.Hour) + } + return t.Add(-1 * time.Duration(offset) * time.Hour) +} + var ( x *xorm.Engine tables []interface{}