为了账号安全,请及时绑定邮箱和手机立即绑定

Golang/mgo:如何在 mongodb 中存储日期(不是 ISODate)?

Golang/mgo:如何在 mongodb 中存储日期(不是 ISODate)?

Go
POPMUISE 2022-01-17 20:13:51
如果我像这样存储当前时间:type Test struct {    Id string `bson:"id" json:"id,omitempty"`    TestTime time.Time `bson:"testTime" json:"testTime,omitempty"`}...t := Test {    Id : "TEST0001",    TestTime : time.Now(),}...c.Insert(t)然后我使用 mongochef 搜索它:{     "_id" : ObjectId("576bc7a48114a14b47920d60"),     "id" : "TEST0001",     "testTime" : ISODate("2016-06-23T11:27:30.447+0000")}那么,mgo 默认存储 ISODate ,我怎样才能存储 Date 而不是 ISODate ?
查看完整描述

2 回答

?
忽然笑

TA贡献1806条经验 获得超5个赞

mgo 自动转换time.Time为 Mongo 内部日期数据类型(source,实际上它只是一个没有时区信息的时间戳,并且总是更正为 UTC)。任何其他功能都必须由您手动实现。

您可以通过实现包中的GetterSetter接口来强制 mgo 正确(反)序列化您的类型,因为包mgo/bson认为它非常低级,所以要小心。


查看完整回答
反对 回复 2022-01-17
?
青春有我

TA贡献1784条经验 获得超8个赞

您应该定义一个像这样保存时区的自定义结构。


您可以定义一个自定义Unmarshal来更改加载日期的位置。


func (t *TimeWithTimezone) Unmarshal(in []byte, out interface{}) (err error) {

    type decode TimeWithTimezone

    var d decode

    if err := bson.NewDecoder(in).Decode(&d); err != nil {

        return err

    }

    loc, err := FixedZone(d.Timezone, d.Timezone)

    if err != nil {

        return fmt.Errorf("Invalid Timezone: %s", d.Timezone)

    }

    t.Time = d.Time.In(loc)

    t.Timezone = d.Timezone

    return nil

}

像这样的东西应该可以解决问题,它没有经过测试,只是为了给你一个想法!


查看完整回答
反对 回复 2022-01-17
  • 2 回答
  • 0 关注
  • 398 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号