I'm using GORM to retrieve data from a Postgresql database. Inside the postgresql database I'm storing times as the default UTC. When I load them through gorm/golang I would like to automatically convert them to 'Europe/London' location.
Currently, all times are returned as my local timezone (CEST). I'm struggling to find a way to manually override this?
Here is the relevant code:
type Booking struct {
gorm.Model
Service Service
ServiceID uint `json:serviceId`
Start time.Time
Finish time.Time
}
func getBookings() http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
bookings := &[]Booking{}
GetDB().Find(bookings)
render.JSON(w, r, bookings)
}
}
I've been looking around and I can't seem to find any information from gorm or golang docs. The two closest things to mentions of this problem that I've found is:
https://github.com/jinzhu/gorm/wiki/How-To-Do-Time
Setting timezone globally in golang
I thought a work around could be to manually change the query results with a loop, but I'm not sure if this is the most efficient solution? - code below:
func getBookings() http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
bookings := &[]Booking{}
timeZoneBookings := *&[]Booking{}
GetDB().Find(bookings)
for _, booking := range *bookings {
booking.Start = parseToUkTime(booking.Start)
booking.Finish = parseToUkTime(booking.Finish)
timeZoneBookings = append(timeZoneBookings, booking)
}
render.JSON(w, r, timeZoneBookings)
}
}
func parseToUkTime(timeToParse time.Time) time.Time {
loc, _ := time.LoadLocation("Europe/London")
t := timeToParse.In(loc)
return t
}
Here is an image of the DB entry:
I assumed it would be easy to either state inside the type I would like the location to be set to Europe/London
so the struct would automatically be populated this way, however this doesn't seem to be the case? It's the first time I have worked with timezones, so everything is quite confusing.