簡體   English   中英

Go MySql驅動程序沒有正確設置時間

[英]Go MySql driver doesn't set time correctly

我一直在開發一個微軟服務,在golang中與mysql交互一段時間,我喜歡這種才華橫溢的語言。 無論如何都有問題,不知道問題出在哪里,在我的代碼中,在mysql的mysql驅動程序中。 所以我的機器時區utc + 3,我分享一些結果可能會有所幫助

//created_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
mysql> select now();
"2016-11-07 22:43:02", //that is correct.

在去

fmt.PrintLn(time.Now().Local())
"2016-11-07 22:51:02" //that is correct too

但是當我將實體添加到db中時,mysql workbench顯示錯誤的日期時間。

"2016-11-07 19:51:02" // 

去代碼:

func (this *AppLogHandler) addLog(_log *AppLog) (int64, error){
    fmt.Println("addLog")
    db:= this.Context.DB
    stmt, err := db.Prepare("INSERT tbl_logs SET user_id=?,ip_proxy=?, ip_original=?, end_point=?, http_method=?, message=?, status=?, created_date=?")
    if(err != nil){
        log.Println(err)
        return -1, err
    }
    defer stmt.Close()
    res, err := stmt.Exec(&_log.UserID, &_log.IPProxy, &_log.IPOriginal, &_log.Endpoint, &_log.HttpMethod, &_log.Message, &_log.Status, &_log.CreatedDate)
    if(err != nil){
        log.Println(err)
        return -1, err
    }
    return res.LastInsertId()
}

/// some code here
    app_log := AppLog{}
    app_log.IPProxy = r.RemoteAddr
    app_log.IPOriginal = r.Header.Get("X-Forwarded-For")
    app_log.CreatedDate = time.Now().Local()
    app_log.UserID = user_id
    app_log.Endpoint = r.URL.Path
    app_log.HttpMethod = r.Method
    fmt.Println(app_log.CreatedDate)
    return this.addLog(&app_log)

所以,我需要你的幫助。 幾個小時我都無法解決問題。

mysql=>  Ver 14.14 Distrib 5.7.15, for osx10.11 (x86_64) using  EditLine wrapper
go => 1.7
mysql driver => 1.2, https://github.com/go-sql-driver/mysql/

mysql驅動程序有一個默認時區配置參數 ,您可以將其設置為time.Local (默認為time.UTC )。 保存該值時,它首先將時間戳轉換為UTC時區 ,然后將其發送到數據庫。

正如評論中已經說明的那樣,一種更強大的方法是接受默認的Loc ,並在數據庫中標准化UTC。 這大大簡化了與日期數學有關的任何事情,並且如果您在顯示值時將其從UTC轉換為本地,則不會對查看數據的人的時區進行假設。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM