如何使用自定义时区自动填充类型为“time.Time”的结构字段?

How to automatically populate struct fields with type `time.Time` with custom time zone?

我正在使用 GORM 从 Postgresql 数据库中检索数据。在 postgresql 数据库中,我将时间存储为默认的 UTC。当我通过 gorm/golang 加载它们时,我想自动将它们转换为 'Europe/London' 位置。

目前,所有时间都作为我的本地时区 (CEST) 返回。我正在努力寻找一种方法来手动覆盖它?

相关代码如下:

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)
    }
}

我一直在四处寻找,似乎无法从 gorm 或 golang 文档中找到任何信息。我发现最接近提及此问题的两件事是:

https://github.com/jinzhu/gorm/wiki/How-To-Do-Time

我认为解决方法是使用循环手动更改查询结果,但我不确定这是否是最有效的解决方案? - 代码如下:

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

}

这是数据库条目的图像:

我认为很容易在我希望将位置设置为 Europe/London 的类型中声明,因此结构将自动以这种方式填充,但这似乎不是案件?这是我第一次使用时区,所以一切都很混乱。

遍历切片并更新时间值。在处理程序之外查找位置。

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)
    }
}