Goの時刻扱いについて。しかし日付時刻の扱いを網羅すると果てしない旅路になるので、今回は触りだけ、現在時刻を出力。
Goにおいて時刻はロケーション情報を持つtime構造体に格納される。timeで定義済みロケーションはtime.UTC
と、time.Local
の2つ。それ以外のロケーションを呼び出すには一手間必要で、例えば正式にJSTの時刻を定義するならこうするとかあるけれども、日付時刻の扱いを網羅すると(ry …なので今回はスキップ。
time1.go
package main
import (
"fmt"
"time"
)
func main() {
//現在時刻をUTCで出力
fmt.Println("UTCの現在時刻:", time.Now().UTC())
//ローカルの現在時刻を出力
fmt.Println("JSTの現在時刻:", time.Now().Local())
}
出力結果
$ go run time1.go
UTCの現在時刻: 2022-01-16 07:49:06.70495 +0000 UTC
JSTの現在時刻: 2022-01-16 16:49:06.705033 +0900 JST
次に、UNIXタイムスタンプの値を出力してみる。さらにデータ型を出力させる。
time2.go
package main
import (
"fmt"
"time"
)
func main() {
//時刻定義を変数に格納
t1 := time.Now().UTC()
t2 := time.Now().Local()
t3 := time.Now().Unix()
//通常の時刻で値と型を出力
fmt.Println("UTCの現在時刻:",t1)
fmt.Printf("%T\n", t1)
fmt.Println("JSTの現在時刻:",t2)
fmt.Printf("%T\n", t2)
//UNIXタイムスタンプの値と型を出力
fmt.Println("UNIXタイムスタンプ:",t3)
fmt.Printf("%T\n", t3)
}
出力結果。UNIXタイムスタンプはint64
で、他はtime.Time
であると分かる。
$ go run time2.go
UTCの現在時刻: 2022-01-16 07:55:54.772297 +0000 UTC
time.Time
JSTの現在時刻: 2022-01-16 16:55:54.772298 +0900 JST
time.Time
UNIXタイムスタンプ: 1642319754
int64
最後にUNIXタイムスタンプをTime型に変換してみる。
time3.go
package main
import (
"fmt"
"time"
)
func main() {
//UNIXタイムスタンプをTime型に変換し、値と型を出力。
t := time.Unix(1642319638, 0)
fmt.Println(t.Format("2006-01-02 15:04:05")) //2022-01-16 16:53:58
fmt.Printf("%T\n", t) //time.Time
}
時刻出力/変換、タイムゾーンの問題はどの言語でも避けて通れない手強い敵なのだが、こればっかりやってもいられないので、まぁボチボチやっていこう。
参考
Go言語の時刻演算パッケージ「time」の使い方メモ
[Go] Unix タイムスタンプを Time 型のデータに変換する
【Go入門】型(type)を調べる – %T と Printf()