timeパッケージには、時間に関するあらゆる便利なものが含まれています。
この記事では、Goのtimeパッケージについて深掘りします。
timeパッケージのSleep()関数
まず、time パッケージをインポートする必要があります。
import "time"
timeパッケージには、Goのメインスレッドを一時停止することができるsleep関数があります。
使い方は以下の通りです。
package main
import (
"fmt"
"time"
)
func main() {
fmt.Println(time.Now()) // 2020-02-25 23:00:00 +0000 UTC m=+0.000000001
time.Sleep(2 * time.Second)
fmt.Println(time.Now()) // 2020-02-25 23:00:02 +0000 UTC m=+2.000000001
}
timeパッケージ内のデータ型
timeパッケージには、さまざまなシーンで活躍する複数の型が存在します。
ここでは、重要なものを紹介します。
Duration 型は、経過時間または時間間隔を Golangで表現します。
package main
import (
"fmt"
"time"
)
func main() {
t1 := time.Now()
time.Sleep(2 * time.Second)
t2 := time.Now()
fmt.Println("Duration was: ", t2.Sub(t1)) // Duration was: 2s
}
Durationはナノ秒の精度まで生成することができます。これらのプロパティを取得するためには、Durationオブジェクトから型を呼び出す必要があります。
package main
import (
"fmt"
"time"
)
func main() {
t1 := time.Now()
time.Sleep(3 * time.Second)
t2 := time.Now()
t := t2.Sub(t1)
fmt.Println(t, t.Milliseconds(), t.Microseconds(), t.Nanoseconds()) // 3s 3000 3000000 3000000000
}
Locationは、タイムゾーンの特定位置を表します。
Month型は月を表すint型です。
Time型は時間を表し、これから見るように様々な操作のための多くの関数を含んでいます。
time関数
time構造体には、多くのメソッドが関連付けられています。
ここでは、そのいくつかを紹介します。
package main
import (
"fmt"
"time"
)
func main() {
var t time.Time
t = time.Now()
fmt.Println(t.Date())
fmt.Println(t.Day())
fmt.Println(t.Month())
fmt.Println(t.Second())
fmt.Println(t.Minute())
}
タイムゾーンは、便利な関数Zone()を使って取得できます。
package main
import (
"fmt"
"time"
)
func main() {
var t time.Time
t = time.Now()
fmt.Println(t.Zone()) // IST 19800
}
関数を使って時間の足し算や引き算を行い、正確に時間を出力することができます。
Unixnano関数は、ナノ秒単位でUnix時間を出力します。
package main
import (
"fmt"
"time"
)
func main() {
var t time.Time = time.Now()
fmt.Println(t.UnixNano()) // 1257894000000000000
}
timeパッケージにおけるBefore()関数とAfter()関数
before, after関数は、ある時刻が他の時刻より前か後かを調べます。
package main
import (
"fmt"
"time"
)
func main() {
t1 := time.Date(2017, 1, 1, 0, 0, 0, 0, time.UTC)
t2 := time.Date(2019, 2, 1, 0, 0, 0, 0, time.UTC)
fmt.Println(t1.Before(t2)) // true
fmt.Println(t1.After(t2)) // false
}