bauer's diary

凡人の凡人による凡人のための備忘録

golang製のREPL内でUnixタイムスタンプから日付フォーマットを取得する

忘れがちだけど、よくある動作なので書き留めておきます。

準備

goreをインストールしておきます。
github.com

$ go get -u github.com/motemen/gore

"gore" とは、コード補完もしてくれるREPL(Read-eval-print loop)で、文字通り読んで評価して表示して繰り返すツールのことです。
仕組み的には、裏ではそれまでの入力を順番に実行するソースコードを生成して "go run" しています。

goreをより使いこなしたい場合は下記もインストールしておくとよいです。

# 入力補完
$ go get -u github.com/nsf/gocode
# プリティプリント
$ go get -u github.com/k0kubun/pp
# ドキュメント
$ go get -u golang.org/x/tools/cmd/godoc


実践

$ gore
gore > :import time

# 第一引数に日付フォーマット変換したいUnixタイムスタンプ
gore > t := time.Unix(1488697427, 0)
time.Time{sec:63624294227, nsec:0, loc:(*time.Location)(0x1070a0)}

gore > t.Format(time.RFC3339)
"2017-03-05T16:03:47+09:00"

フォーマットの種類は公式のformat.goのdocを参照してください。
https://golang.org/src/time/format.go

逆に、指定した日付のタイムスタンプを取得する場合

UTCでの、2016年1月1日0時00分の定点がほしい場合

$ gore
gore > :import time

gore > day := time.Date(2016, 1, 1, 0, 0, 0, 0, time.UTC)
time.Time{sec:63587203200, nsec:0, loc:(*time.Location)(nil)}

gore> day.String()
"2016-01-01 00:00:00 +0000 UTC"

gore> day.Unix()
1451606400

東京での、2016年1月1日0時00分の定点がほしい場合

# ロケーション名とUTCとの時差で、ロケーション構造体を作成
gore> jst := time.FixedZone("Asia/Tokyo", 9 * 60 * 60)
&time.Location{name:"Asia/Tokyo", zone:[]time.zone{time.zone{name:"Asia/Tokyo", offset:32400, isDST:false}}, tx:[]time.zoneTrans{time.zoneTrans{when:-9223372036854775808, index:0x0, isstd:false, isutc:false}}, cacheStart:-9223372036854775808, cacheEnd:9223372036854775807, cacheZone:(*time.zone)(0xc42000a3e0)}

gore> day := time.Date(2016, 1, 1, 0, 0, 0, 0, jst)
time.Time{sec:63587170800, nsec:0, loc:(*time.Location)(0xc42006e120)}

gore> day.String()
"2016-01-01 00:00:00 +0900 Asia/Tokyo"

gore> day.Unix()
1451574000


おしまい