ctx, _ := context.WithTimeout(context.Background(), 10*time.Second)
opt := options.Client().ApplyURI("mongodb://localhost:27017")
// findでstructにtime.Time型が設定されている状態で、取得するとUTCで設定されるのでLocalTimeZoneになるようにした。
rb := bson.NewRegistryBuilder()
// v1.2.1より前
// rb.RegisterDecoder(reflect.TypeOf(time.Time{}), bsoncodec.NewTimeCodec(bsonoptions.TimeCodec().SetUseLocalTimeZone(true)))
// v1.3.0以降 メソッドが変更になっている。。。
rb.RegisterTypeDecoder(reflect.TypeOf(time.Time{}), bsoncodec.NewTimeCodec(bsonoptions.TimeCodec().SetUseLocalTimeZone(true)))
opt.SetRegistry(rb.Build())
client, _ := mongo.Connect(ctx, opt)
col := client.Database("hoge").Collection("fuga")
type fuga struct {
T1 time.Time `bson:"t1"`
T2 primitive.DateTime `bson:"t2"`
}
now := time.Now()
col.DeleteMany(ctx, &map[string]interface{}{})
col.InsertOne(ctx, &map[string]interface{}{"t1": now, "t2": now})
result := &fuga{}
sr := col.FindOne(ctx, &map[string]interface{}{})
sr.Decode(result)
fmt.Println(result.T1)
fmt.Println(result.T2.Time())
// registryセット前
// 2020-02-28 05:50:26.759 +0000 UTC
// 2020-02-28 14:50:26.759 +0900 JST
// registryセット後
// 2020-02-28 14:52:51.103 +0900 JST
// 2020-02-28 14:52:51.103 +0900 JST
なお、mapにデコードすると、primitive.DateTime
でデコードされるのでJSTになるっぽい。
所感
ドキュメントに無いから、実装を追ってみた。
コード追うの大変だったので、ぜひドキュメントに追記いただきたい。。。
あと、設定してすぐに、v1.3.0でメソッド名が変わったので、コンボ食らった気分だった。。。