init: 初始化项目
This commit is contained in:
73
types/json_time.go
Normal file
73
types/json_time.go
Normal file
@@ -0,0 +1,73 @@
|
||||
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)
|
||||
}
|
||||
Reference in New Issue
Block a user