2016-11-07 14 views
0

golangでmysqlをしばらく使用しているマイクロサービスを開発しています。この才能のある言語が大好きです。とにかく問題があり、どこに問題があるのか​​わかりません。私のコードで、mysqlドライバをmysqlに入れてください。だから、私のマシンのタイムゾーンUTC + 3、私は共有していますいくつかの結果は、それが行くGo MySqlドライバで時刻が正しく設定されない

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

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

に役立ちますが、私はDBにエンティティを追加する場合、MySQLのワークベンチは私に間違った日時を示しかもしれません。

"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/ 
+0

これはすべて同じマシンで実行していますか?異なるタイムゾーンのマシンで実行している場合、またはNTPサーバーと同期していない場合、異なる結果が得られます。 –

+0

はい、同じマシンにあります – RockOnGom

+0

ドライバが文字列として渡している可能性があり、time.Timeコンストラクタに解析してUTCに変換します。 time.Time#Local()はtime.Timeを返します。 Hmmm –

答えて

1

MySQLドライバを使用すると、(デフォルトはtime.UTCある)time.Localに設定することができconfiguration parameter for the default time zoneを持っています。値を保存するときは、最初にconverts the time stamp to the UTC time zoneとし、それをデータベースに送ります。

コメントですでに述べたように、より堅牢なアプローチはデフォルトのLocを受け入れ、データベースのUTCで標準化することです。これにより、さらに数学の行程を大幅に簡略化し、値を表示するときにUTCからローカルに変換するだけで、データを表示する人の時間帯についての仮定は行われません。

関連する問題