1 回答

TA貢獻1906條經驗 獲得超10個贊
與 time.Time 相反,你的類型沒有實現fmt.Stringer,所以 fmt.Print* 函數別無選擇,只能使用它們的默認格式化邏輯,在這種情況下是打印底層 time.Time 值的字段大括號。
將委托給 time.Time.String 的 String 方法添加到您的類型以獲得所需的行為:
func (t Time) String() string {
return time.Time(t).String()
}
https://go.dev/play/p/5PwOwa49B5X
或者,將您的時間類型更改為嵌入 time.Time。這將自動提升 String 方法以及所有其他方法(例如 Marshal* 方法):
type Time struct {
time.Time
}
func (st *Time) UnmarshalJSON(b []byte) error {
// ...
st.Time = t // simple assignment without type conversion
return nil
}
https://go.dev/play/p/0H5qyCO22gu
此外,您永遠不應該手動解析 JSON。strings.Trim(string(b), "\"")不足以完全解碼 JSON 字符串值。始終使用 json.Unmarshal。您可以使用 time.ParseInLocation 來簡化。
func (st *Time) UnmarshalJSON(b []byte) error {
var s string
if err := json.Unmarshal(b, &s); err != nil {
return err
}
t, err := time.ParseInLocation("2006-01-02T15:04:05", s, time.UTC)
if err != nil {
return err
}
// ...
}
- 1 回答
- 0 關注
- 68 瀏覽
添加回答
舉報