| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 |
- package models
- import (
- "strings"
- "time"
- )
- type LocalTime time.Time
- func init() {
- AddTableName("local_time")
- }
- const (
- timeFormat = "2006-01-02 15:04:05"
- zeroTime = "0001-01-01 00:00:00"
- )
- func NowLocal() LocalTime {
- return LocalTime(time.Now())
- }
- func (t *LocalTime) UnmarshalJSON(data []byte) error {
- if data[0] == '"' && data[len(data)-1] == '"' {
- data = data[1: len(data)-1]
- }
- dataStr := strings.TrimSpace(string(data))
- if dataStr == "" {
- now, err := time.ParseInLocation(timeFormat, string(data), time.Local)
- *t = LocalTime(now)
- return err
- }
- var err error
- var now time.Time
- if strings.Index(dataStr, "T") > 0 {
- dataStr = strings.Replace(dataStr, "T", " ", 1)
- }
- if len(dataStr) > 19 {
- dataStr = dataStr[0:19]
- if dataStr == "0001-01-01 00:00:00" {
- dataStr = timeFormat
- }
- } else if len(dataStr) == 10 {
- dataStr += " 00:00:00"
- } else if len(dataStr) == 13 {
- dataStr += ":00:00"
- } else if len(dataStr) == 16 {
- dataStr += ":00"
- }
- now, err = time.ParseInLocation(timeFormat, dataStr, time.Local)
- *t = LocalTime(now)
- return err
- }
- func (t LocalTime) MarshalJSON() ([]byte, error) {
- b := make([]byte, 0, len(timeFormat)+2)
- b = append(b, '"')
- b = time.Time(t).AppendFormat(b, timeFormat)
- b = append(b, '"')
- return b, nil
- }
- func (t LocalTime) Value() time.Time {
- return time.Time(t)
- }
- func (t LocalTime) String() string {
- return t.Value().String()
- }
- // 数据库解析到对象时调用
- func (t *LocalTime) FromDB(data []byte) error {
- if data[0] == '"' && data[len(data)-1] == '"' {
- data = data[1: len(data)-1]
- }
- dataStr := strings.TrimSpace(string(data))
- if dataStr == "" {
- now, err := time.ParseInLocation(timeFormat, string(data), time.Local)
- *t = LocalTime(now)
- return err
- }
- var err error
- var now time.Time
- if strings.Index(dataStr, "T") > 0 {
- dataStr = strings.Replace(dataStr, "T", " ", 1)
- }
- if len(dataStr) > 19 {
- dataStr = dataStr[0:19]
- if dataStr == "0000-00-00 00:00:00" {
- dataStr = zeroTime
- }
- } else if len(dataStr) == 10 {
- dataStr += " 00:00:00"
- } else if len(dataStr) == 13 {
- dataStr += ":00:00"
- } else if len(dataStr) == 16 {
- dataStr += ":00"
- }
- now, err = time.ParseInLocation(timeFormat, dataStr, time.Local)
- *t = LocalTime(now)
- return err
- }
- // 对象解析到数据库时调用
- func (t LocalTime) ToDB() ([]byte, error) {
- b := make([]byte, 0, len(timeFormat)+2)
- b = append(b, []byte(time.Time(t).Format(timeFormat))...)
- return b, nil
- }
|