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

 

RWC2019 RWC2019


関連がありそうな記事