问题: 进行数据库时间对比。字段有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 函数的使用
可以自行查看使用哈。
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 协议》,转载必须注明作者和本文链接