在golang查询mongodb时,如何获取UTC时间

在golang查询mongodb时,如何获取UTC时间,mongodb,go,mgo,Mongodb,Go,Mgo,我对Golang和MongoDB比较陌生,遇到了一个日期问题,似乎我可以在MongoDB中插入UTC日期,但当我通过Golang查询时,它会自动转换为本地时间。我想用UTC从MongoDB取回它,不需要转换。下面是一个简单的例子: type SampleItem struct { ObjId bson.ObjectId `bson:"_id,omitempty" json:"-"` SampleDate time.Time `bson:"sampleDate"

我对Golang和MongoDB比较陌生,遇到了一个日期问题,似乎我可以在MongoDB中插入UTC日期,但当我通过Golang查询时,它会自动转换为本地时间。我想用UTC从MongoDB取回它,不需要转换。下面是一个简单的例子:

type SampleItem struct {
    ObjId      bson.ObjectId `bson:"_id,omitempty" json:"-"`
    SampleDate time.Time     `bson:"sampleDate" json:"sampleDate"`
}

func TestMe() {

    var item SampleItem
    var items []SampleItem

    sess := getSession()
    defer sess.Close()

    item.SampleDate = time.Now().UTC()
    fmt.Printf("%s\n", item.SampleDate)

    collection := sess.DB("myCollection").C("sampleItems")
    collection.Insert(item)

    err := collection.Find(bson.M{}).All(&items)
    if err == nil {
        fmt.Printf("%s\n", items[0].SampleDate)
    }
}
我的输出:

2014-10-12 04:10:50.3992076+0000 UTC

2014-10-11 23:10:50.399-0500加拿大东部时间

mgo驱动程序可能会自动转换它,因为当我从控制台窗口查询mongodb时,我的日期是UTC。我是否在某个地方丢失了一个mgo选项来关闭此功能?

Go值存储时间和位置上的一个瞬间。mgo BSON解码器将位置设置为

您可以将
time.Local
设置为UTC位置:

time.Local = time.UTC
设计用于第三方的包不应修改本地位置,但在应用程序范围内可以

该方法返回的时间与接收器的时间相同,并且位置设置为UTC。此行将以UTC格式打印时间:

    fmt.Printf("%s\n", items[0].SampleDate.UTC())

因为MongoDB存储时间的精度低于时间。时间,所以从MongoDB返回的值可能不等于您存储的值。

我知道我问了这个问题,但经过反复研究,我发现这是一个可能的选择。通过使用time.time的自定义类型,您可以覆盖json序列化程序接口并强制使用UTC。然而,做这类事情是否值得推荐

我必须对go来源给予一些信任

type JsonTime time.Time

func (t JsonTime) MarshalJSON() ([]byte, error) {
    tt := time.Time(t).UTC()
    if y := tt.Year(); y < 0 || y >= 10000 {
        return nil, errors.New("JsonTime: year outside of range [0,9999]")
    }
    if y := tt.Year(); y == 1 {
        return []byte{}, nil
    }
    return []byte(tt.Format(`"` + time.RFC3339Nano + `"`)), nil
}

func (t JsonTime) GetBSON() (interface{}, error) {
    if time.Time(t).IsZero() {
        return nil, nil
    }
    return time.Time(t), nil
}

func (t *JsonTime) SetBSON(raw bson.Raw) error {
    var tm time.Time

    if err := raw.Unmarshal(&tm); err != nil {
        return err
    }

    *t = JsonTime(tm)
    return nil
}

func (t JsonTime) String() string {
    return time.Time(t).UTC().String()
}

type SampleItem struct {
    ObjId      bson.ObjectId `bson:"_id,omitempty" json:"-"`
    SampleDate JsonTime      `bson:"sampleDate" json:"sampleDate"`
}

func TestMe() {

    var item SampleItem
    var items []SampleItem

    sess := getSession()
    defer sess.Close()

    item.SampleDate = JsonTime(time.Now().UTC())
    fmt.Printf("%s\n", item.SampleDate)

    collection := sess.DB("myCollection").C("sampleItems")
    collection.Insert(item)

    err := collection.Find(bson.M{}).All(&items)
    if err == nil {

        fmt.Printf("%s\n", items[0].SampleDate)
        if data, err := json.Marshal(items); err != nil {
            fmt.Printf("%v\n", err)
        } else {
            fmt.Printf("%s\n", data)
        }
    }
}
键入JsonTime time.time
func(t JsonTime)MarshalJSON()([]字节,错误){
tt:=time.time(t).UTC()
如果y:=tt.Year();y<0 | | y>=10000{
返回nil,errors.New(“JsonTime:year超出范围[09999]”)
}
如果y:=tt.Year();y==1{
返回[]字节{},无
}
返回[]字节(tt.Format(``+time.RFC3339Nano+``)),无
}
func(t JsonTime)GetBSON()(接口{},错误){
如果time.time(t.)为零(){
返回零,零
}
返回时间。时间(t),零
}
func(t*JsonTime)SetBSON(raw bson.raw)错误{
时间,时间
如果错误:=raw.Unmarshal(&tm);错误!=nil{
返回错误
}
*t=JsonTime(tm)
归零
}
func(t JsonTime)String()字符串{
返回时间.time(t).UTC().String()
}
类型SampleItem结构{
ObjId bson.ObjectId`bson:\u id,省略空的“json:-”`
SampleDate JsonTime`bson:“SampleDate”json:“SampleDate”`
}
func TestMe(){
变量项SampleItem
var items[]SampleItem
sess:=getSession()
延迟sess.Close()
item.SampleDate=JsonTime(time.Now().UTC())
fmt.Printf(“%s\n”,item.SampleDate)
集合:=sess.DB(“myCollection”).C(“sampleItems”)
收藏。插入(项目)
err:=collection.Find(bson.M{}).All(&items)
如果err==nil{
fmt.Printf(“%s\n”,项[0].SampleDate)
如果是数据,err:=json.Marshal(items);err!=nil{
fmt.Printf(“%v\n”,错误)
}否则{
fmt.Printf(“%s\n”,数据)
}
}
}

OK。我的部分问题是我正在序列化为json,类似这样:data,err:=json.Marshal(items[0]);json数据是错误的时间。如何让json输出以UTC进行序列化?我喜欢这种简单性,但希望有一种方法,在序列化为json之前,我不必记得设置为UTC。我研究了如何从time.time创建一个自定义类型,这将允许我设置一个使用UTC的自定义json序列化程序。我会把它作为一个可能的答案发布,但我对那些有更多经验的人关于它是否是一个好的选择的评论感兴趣。这正是我想要的类型。似乎它能满足我的需要。谢谢