Skip to the content.

Working with time.Time

By default when interpolating time.Time (and *time.Time) goqu will convert it UTC before interpolating.

Why?

For most use cases UTC should be preferred, if a timezone is specified it is usually ignored silently by postgres and mysql unless you configure your DB to run in a different timezone, leading to unexpected behavior.

How to use a different default timezone?

goqu provides a global configuration settings to set the location to convert all timestamps to.

To change the default timezone to covert time instances to you can use goqu.SetTimeLocation to change the default timezone.

In the following example the default value UTC is used.

created, err := time.Parse(time.RFC3339, "2019-10-01T15:01:00Z")
if err != nil {
	panic(err)
}

ds := goqu.Insert("test").Rows(goqu.Record{
	"address": "111 Address",
	"name":    "Bob Yukon",
	"created": created,
})

Output:

INSERT INTO "test" ("address", "created", "name") VALUES ('111 Address', '2019-10-01T15:01:00Z', 'Bob Yukon')

In the following example UTC is overridden to Asia/Shanghai

loc, err := time.LoadLocation("Asia/Shanghai")
if err != nil {
	panic(err)
}

goqu.SetTimeLocation(loc)

created, err := time.Parse(time.RFC3339, "2019-10-01T15:01:00Z")
if err != nil {
	panic(err)
}

ds := goqu.Insert("test").Rows(goqu.Record{
	"address": "111 Address",
	"name":    "Bob Yukon",
	"created": created,
})

Output:

INSERT INTO "test" ("address", "created", "name") VALUES ('111 Address', '2019-10-01T23:01:00+08:00', 'Bob Yukon')