系统库函数如何重写且不影响其他地方引用?

使用time.Time从数据库中解析出来,再通过time自身的json解析,得到的是RFC3339Nano格式的,但我想要的是unix格式的

func (t Time) MarshalJSON() ([]byte, error) {
    if y := t.Year(); y = 10000 {
        // RFC 3339 is clear that years are 4 digits exactly.
        // See golang.org/issue/4556#c15 for more discussion.
        return nil, errors.New("Time.MarshalJSON: year outside of range [0,9999]")
    }
    return []byte(t.Format(`"` + RFC3339Nano + `"`)), nil
}

之后自定义了一个

type JsonTimestamp time.Time

实现了上面的函数得到unix格式的时间,但数据库那边不能解析到我自定义的时间类型,这个有什么其他方法吗?

共 12 个回复


heimeil

找到蠢办法解决了,不知道有没有大神知道我表达这个意思类似的办法?

# 0

snake117

Unix()方法?得到一个整数,然后你可以strconv.Itoa或者binary.PutUvarint函数?

老实说没看懂你的意思。

# 1

darksword

为什么不在系统库函数上面再包装一层呢?

# 2

heimeil

@snake117 @darksword 表达能力太弱了,json.Marshal函数会调用每个成员的MarshalJSON函数,我就包装了一层

type JsonTimestamp time.Time

实现了JsonTimestamp的MarshalJSON函数,返回了UNIX格式的时间

但数据库驱动不认这个JsonTimestamp类型,无法将数据库的时间解析到JsonTimestamp

# 3

David

你的数据库里面保存的是字符串?这种情况你就数据库接口就用string好了,得到string之后自己转换成Time

# 4

bigbear

   var t1 time.Time
   row.Scan(&t1)
   var cust Customer
   cust.CreateTime = New_JsonTimestamp(t1)

这个应该很简单把, 如果你期望row.Scan( JsonTimestamp ) 能这样直接支持,

我想, 只能自己修改数据库适配器的源代码了.

# 5

heimeil

@David mysql存的timestamp格式能用string吗?感觉是要同时实现json解析和数据库驱动的节奏。

# 6

heimeil

@bigbear 貌似只有自己实现数据库驱动了,不过比之前的蠢办法更蠢。

# 7

stevewang

mysql里存取时间字段用字符串操作就可以。

# 8

cougar

定义一个struct,成员是 time.Time, 然后重写这个struct的 MarshalJSON 方法,使用的时候把新struct当time.Time用

这个是你说的蠢办法吗?

# 9

heimeil

@cougar 现在就是不能把新struct当time.Time用,我的蠢办法就是在这个时间字段的父struct的MarshalJSON里将time.Time强转成JsonTimestamp再交给json库处理,感觉这不符合go的风格。

# 10

wuhanyucheng

求联系方式啊啊啊???wo QQ 709285414

# 11