2016-11-07 5 views
0

Я разрабатываю микросервис, который некоторое время взаимодействует с mysql в golang, и мне нравится этот талантливый язык. Во всяком случае, есть проблема и не знаю, где проблема, в моем коде, в mysql driver else в mysql. Так что моя машина часовой пояс UTC + 3, я делюсь некоторыми результат может быть, это помогаетПерейти MySql драйвер не установлен правильно

//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 

Но когда я добавил объект в БД, MySQL Workbench показывает мне неправильно DateTime.

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

Go Код:

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() возвращает время. Время. Hmmm –

ответ

1

Драйвер MySQL имеет configuration parameter for the default time zone, который можно установить в time.Local (по умолчанию time.UTC). Когда вы сохраняете значение, оно сначала converts the time stamp to the UTC time zone, а затем отправляет его в базу данных.

Как уже указывалось в комментариях, гораздо более надежный подход состоял бы в том, чтобы принять значение по умолчанию Loc и стандартизировать по UTC в базе данных. Это значительно упрощает все, что связано с математикой даты дальше по линии, и не делает предположений о часовом поясе человека, просматривающего данные, если вы просто конвертируете его из UTC в локальный при отображении значения.

Смежные вопросы