Golang中ISO日期格式(YYYY-MM-DD)处理问题求助
解决Go中数据库日期转为YYYY-MM-DD格式的问题
首先你之前尝试在结构体定义里直接用time.Format是不对的——结构体字段需要指定类型,而不是格式化语句。下面给你两种实用的解决方案:
方法一:用time.Time字段存储,扫描后按需格式化
这是最直观的方式,先把日期扫描为time.Time类型,之后再用Format方法转成你要的YYYY-MM-DD格式:
import "time" type hr struct { USER_DATE time.Time USER_ID string } // 执行查询与扫描逻辑 rows, err := db.Query(`SELECT "USER_DATE","USER_ID" FROM user`) if err != nil { http.Error(w, http.StatusText(500), 500) return } defer rows.Close() for rows.Next() { var item hr err := rows.Scan(&item.USER_DATE, &item.USER_ID) if err != nil { // 处理扫描错误,比如跳过当前行或返回错误 continue } // 格式化为目标字符串格式 formattedDate := item.USER_DATE.Format("2006-01-02") // 现在formattedDate就是你需要的"2018-03-21"格式 fmt.Println(formattedDate, item.USER_ID) }
方法二:自定义类型实现sql.Scanner接口,自动转换
如果你希望结构体字段直接存储格式化后的字符串,可以自定义一个类型并实现sql.Scanner接口,这样扫描时会自动完成转换:
import ( "fmt" "time" ) // 自定义日期字符串类型 type DateStr string // 实现sql.Scanner接口,处理数据库值到自定义类型的转换 func (d *DateStr) Scan(value interface{}) error { t, ok := value.(time.Time) if !ok { return fmt.Errorf("expected time.Time type, got %T", value) } // 格式化为YYYY-MM-DD后赋值给自定义类型 *d = DateStr(t.Format("2006-01-02")) return nil } // 重新定义结构体 type hr struct { USER_DATE DateStr USER_ID string } // 查询扫描逻辑 rows, err := db.Query(`SELECT "USER_DATE","USER_ID" FROM user`) if err != nil { http.Error(w, http.StatusText(500), 500) return } defer rows.Close() for rows.Next() { var item hr err := rows.Scan(&item.USER_DATE, &item.USER_ID) if err != nil { continue } // item.USER_DATE已经是"2018-03-21"格式的字符串了 fmt.Println(item.USER_DATE, item.USER_ID) }
小提示
- 确保你的数据库驱动支持将日期字段扫描为
time.Time类型,主流的PostgreSQL、MySQL驱动都默认支持。 - 你例子里的
2018-03-21T00:00:00Z是标准RFC3339格式,time.Time可以直接解析,不需要额外处理。
内容的提问来源于stack exchange,提问作者sibert
相关产品推荐
相关产品推荐

