问题: 进行数据库时间对比。字段有datetime类型,有int类型(表示分钟)。需要判断是否超时

越转出现问题越多。

索性直接使用函数。

分析:

time 结构体为

type Time struct {
    wall unit64     //表示距离公元1年1月1日00:00:00UTC的秒数
    ext  int64      //表示纳秒
    loc  *Location  //代表时区,主要处理偏移量。因为不同的时区,对应的时间不一样
}
datetimeinttimestamp
time

time 函数解决方案演示

代码部分截图

m, _ := time.ParseDuration(fmt.Sprintf("%dm", testInfo.CurrentLimitMaxTime))
now := time.Now()

// 如果 当前时间 >= 相加的时间   超时
if now.Sub(time.Time(testInfo.PickTime).Add(m)) >= 0 {

}

time 函数的使用

可以自行查看使用哈。
golang 进行时间运算,尽量使用time函数的方法,别转来转去。

orm time 的封装

ormtime.go


package util

import (
    "database/sql/driver"
    "encoding/json"
    "fmt"
    "time"
)

const timeFormat = "2006-01-02 15:04:05"

type MyTime time.Time

func (this *MyTime) UnmarshalJSON(data []byte) (err error) {
    now, err := time.ParseInLocation(`"`+timeFormat+`"`, string(data), time.Local)
    *this = MyTime(now)
    return
}

func (this MyTime) MarshalJSON() ([]byte, error) {
    tt := time.Time(this)
    if tt.IsZero() {
        emptyStr, _ := json.Marshal("")
        return emptyStr, nil
    }
    b := make([]byte, 0, len(timeFormat)+2)
    b = append(b, '"')
    b = tt.AppendFormat(b, timeFormat)
    b = append(b, '"')
    return b, nil
}

func (this MyTime) Value() (driver.Value, error) {
    var zeroTime time.Time
    tt := time.Time(this)
    if tt.UnixNano() == zeroTime.UnixNano() {
        return nil, nil
    }
    return tt, nil
}

func (this *MyTime) Scan(v interface{}) error {
    value, ok := v.(time.Time)
    if ok {
        *this = MyTime(value)
        return nil
    }
    return fmt.Errorf("can not convert %v to timestamp", v)
}

func (this MyTime) IsZero() bool {
    tt := time.Time(this)
    if tt.IsZero() {
        return true
    }
    return false
}

func (this MyTime) String() string {
    tt := time.Time(this)
    return tt.String()
}

func (this MyTime) Format() string {
    tt := time.Time(this)
    return tt.Format(timeFormat)
}

func (this MyTime) After(t MyTime) bool {
    tt := time.Time(this)
    return tt.After(time.Time(t))
}

func (this MyTime) Before(t MyTime) bool {
    tt := time.Time(this)
    return tt.Before(time.Time(t))
}

func (this MyTime) Parse(t string) (MyTime, error) {
    tt, err := time.Parse(timeFormat, t)
    return MyTime(tt), err
}

调用方法:在 orm声明中:

`type TestDao struct{`

`Id    uint    `gorm:"primary_key,AUTO_INCREMENT" json:"id"``

`CreatedAt  MyTime `json:"-"``

`UpdatedAt  MyTime `json:"update_at"``

`DeletedAt  *MyTime `json:"-"``

`}`

实现原理

其实现方式其实是通过在save变更时,通过callback功能,将其定义为当前时间。文章可参考 传送门

这样你就可以通过自定义的LocalTime来控制时间格式。

弊端与建议

因为在程序运行时,createAt这类字段的类型还是 LocalTime,所以如果你想自己给其复制,是不太容易做到的。

例如,你想在程序运行时改一下其createAt的时间。你做不到! 因为它的类型是LocalTime,而你的时间要么是时间戳,要么是一个字符串,类型不匹配。。。是不是很尴尬???

所以建议这类保留字段还是不要在程序运行时去修改。只用它作为记录或标识即可。如果真的需要更改时间,还是自己维护字段的内容吧。例如用int存时间戳或string存字符串。然后每次变更时,去修改它的值。

当然也可以将这工作自己封装成一个callback函数,这样你就能够随意控制这个字段了。可参考上文传送门中的内容。

go orm
本作品采用《CC 协议》,转载必须注明作者和本文链接