2014-10-12 67 views
2

我對Golang和MongoDB比較陌生,遇到了日期問題,看起來我可以在MongoDB中插入UTC日期,但是當我通過Golang進行查詢時正在自動轉換爲當地時間。我希望以UTC格式從MongoDB恢復,無需轉換。下面是一個簡單的例子:當我在golang中查詢mongodb時,如何獲得UTC時間

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 CDT

看來,mgo驅動程序可能會自動轉換它,因爲當我從控制檯窗口查詢mongodb我的日期是UTC。我錯過了一個mgo選項,可以關閉它嗎?

回答

5

轉到time.Time值存儲即時和位置。 mgo BSON解碼器將位置設置爲time.Local

您可以設置time.Local爲UTC位置:

time.Local = time.UTC 

的包裝設計使用第三方不應該修改本地位置,但它是一個應用程序的範圍內確定。

Time.UTC()方法在與接收機和設置爲UTC的位置相同的時刻返回一個時間。這條線將打印時間在UTC:

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

因爲MongoDB的存儲時間超過了time.time精度降低,從MongoDB中返回的值可能不是你存儲值相等。

+0

好的。我的問題的一部分是,我序列化爲JSON,如下所示: data,err:= json.Marshal(items [0]); json數據是錯誤的時間。我怎樣才能讓我的JSON輸出在UTC中序列化? – jzapata 2014-10-13 06:06:49

+0

我喜歡簡單的查理,但希望有一種方法,我不必記得在序列化爲json之前設置爲UTC。我期待從time.Time創建一個自定義類型,這將允許我設置使用UTC的自定義json序列化程序。我會把它作爲一個可能的答案發布,但我對那些有更多經驗的人的任何意見感興趣,看它是否是一個好的選擇。 – jzapata 2014-10-15 01:20:10

+0

這正是我尋找的東西的類型。似乎它得到我所需要的。謝謝。 – jzapata 2014-10-15 03:12:42

0

我知道我問過這個問題,但經過大量的挖掘後,我發現這是一個可能的選擇。通過使用time.Time中的自定義類型,您可以覆蓋json串行器接口並強制使用UTC。然而,正在做這種類型的東西推薦...

我不得不給一些功勞UNIX time stamps in Golang以及去源。

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) 
     } 
    } 
}