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.
Loop through the slice and update the time values in place. Lookup the location once outside of the handler.
func getBookings() http.HandlerFunc {
loc, _ := time.LoadLocation("Europe/London")
return func(w http.ResponseWriter, r *http.Request) {
var bookings []Booking
GetDB().Find(&bookings)
for i := range bookings {
booking[i].Start = bookings[i].Start.In(loc)
booking[i].Finish = bookings[i].Finish.In(loc)
}
render.JSON(w, r, bookings)
}
}