如何使用自定义时区自动填充类型为“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)
}
}
我正在使用 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)
}
}