Экономия времени. Время в golang до postgres отметка времени с полем часового пояса - PullRequest
3 голосов
/ 27 февраля 2020

Я пытаюсь проверить свою базу данных (которая является Postgres) моделями в golang. проблема в том, что значение поля с time.Time типа несоответствие, когда я получил его из БД. вот код:

a := myStruct{aTime: time.Now().UTC(), ...}
res, err := db.Exec("INSERT INTO my_table VALUES ($1, $2, ...) RETURNING id", a.aTime, ...)
...
// some logic for setting id in struct a
...
row := db.QueryRow("SELECT * FROM my_table WHERE id = $1", a.id)
var test *myStruct
row.Scan(test)
reflect.DeepEqual(a, test) // returns False
fmt.Printf("%v\n%v", a, test)
// {2020-02-25 12:37:16.906605805 +0000 UTC ...}
// {2020-02-25 12:37:16.906606 +0000 UTC ...}

и тип поля времени в базе данных: timestamp with time zone.

Я тоже попробовал следующее:

a.aTime.Equal(test.aTime) // returns false
a.aTime = a.aTime.Round(time.Second)
test.aTime = test.aTime.Round(time.Second)
a.aTime.Equal(test.aTime) // returns true

но все же refle.DeepEqual возвращает false. проблема заключается во временном поле, потому что, когда я делаю следующее, отражение. DeepEqual становится истинным

a.aTime = test.aTime

Кто-нибудь знает, как это исправить?

1 Ответ

4 голосов
/ 27 февраля 2020

Эти времена не равны:

// {2020-02-25 12:37:16.906605805 +0000 UTC ...}
// {2020-02-25 12:37:16.906606 +0000 UTC ...}

значение DB имеет (округленную) микросекундную точность - время go имеет наносекундную точность.

Я бы предложите округлить ваше время до , чтобы добавить их в базу данных с точностью, которая поддерживается вашей БД и вашими потребностями, например

a.Atime = a.aTime.Round(time.Microsecond) // round to nearest micro (per Markus comment)

res, err := db.Exec("INSERT INTO my_table VALUES ($1, $2, ...) RETURNING id", a.aTime, ...)

Также для сравнения равенства времени, используйте time.Equal () :

Equal сообщает, представляют ли t и u один и тот же момент времени. Два раза могут быть равны, даже если они находятся в разных местах. Например, 6:00 + 0200 и 4:00 UT C равны. Обратитесь к документации по типу Time, чтобы узнать о ловушках использования == со значениями Time; большая часть кода должна использовать равно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...