Files
nebula/types/json_time.go
2026-03-10 16:26:48 +08:00

74 lines
1.4 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package types
import (
"database/sql/driver"
"encoding/json"
"time"
)
type JSONTime time.Time
const TimeFormat = "2006-01-02 15:04:05"
// timeFormatWithFrac SQLite 等可能带小数秒
const timeFormatWithFrac = "2006-01-02 15:04:05.999999999"
func (t JSONTime) MarshalJSON() ([]byte, error) {
return json.Marshal(time.Time(t).Format(TimeFormat))
}
func (t *JSONTime) UnmarshalJSON(data []byte) error {
var s string
if err := json.Unmarshal(data, &s); err != nil {
return err
}
parsed, err := time.Parse(TimeFormat, s)
if err != nil {
return err
}
*t = JSONTime(parsed)
return nil
}
// Value 实现 driver.Valuer供 GORM 写入数据库
func (t JSONTime) Value() (driver.Value, error) {
return time.Time(t), nil
}
// Scan 实现 sql.Scanner供 GORM 从数据库读取
func (t *JSONTime) Scan(value interface{}) error {
if value == nil {
*t = JSONTime(time.Time{})
return nil
}
switch v := value.(type) {
case time.Time:
*t = JSONTime(v)
return nil
case []byte:
tm, err := parseTime(string(v))
if err != nil {
return err
}
*t = JSONTime(tm)
return nil
case string:
tm, err := parseTime(v)
if err != nil {
return err
}
*t = JSONTime(tm)
return nil
default:
*t = JSONTime(time.Time{})
return nil
}
}
func parseTime(s string) (time.Time, error) {
if t, err := time.Parse(timeFormatWithFrac, s); err == nil {
return t, nil
}
return time.Parse(TimeFormat, s)
}