1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

golangのmongo-go-driverを使うとstructのtime.TimeにUTCで日付が入るのでlocal-timeにする方法

Last updated at Posted at 2020-02-28
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でメソッド名が変わったので、コンボ食らった気分だった。。。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?