Goで時刻を取り扱う

More than 1 year has passed since last update.

Goで時刻を取り扱う場合


time型を取得する

time.Time型の変数を取得する方法。


現在時刻から取得する

fmt.Println(time.Now())

// Output:
// 2009-11-10 23:00:00 +0000 UTC

http://play.golang.org/p/z5ZRHrVq4T


日付から取得する

fmt.Println(time.Date(2014, time.December, 31, 12, 13, 24, 0, time.UTC))

// Output:
// 2014-12-31 12:13:24 +0000 UTC

http://play.golang.org/p/iRfCerEQ8R

月はMonthで定義されている。

また、引数の最後のlocationはtime.LoadLocation()などで取得出来る。

loc, _ := time.LoadLocation("Asia/Tokyo")

fmt.Println(time.Date(2014, 12, 31, 8, 4, 18, 0, loc))
// Output:
// 2014-12-31 08:04:18 +0900 JST

http://play.golang.org/p/vQIZPA_1F3


文字列から取得する

t, _ := time.Parse("2006-01-02", "2014-12-31")

fmt.Println(t)
// Output:
// 2014-12-31 00:00:00 +0000 UTC

http://play.golang.org/p/EAw_EloBxc

time.Parse()の第一引数は、Mon Jan 2 15:04:05 -0700 MST 2006の中から選ぶ。

t, _ := time.Parse("2006-01-02 15:04:05 MST", "2014-12-31 12:31:24 JST")

fmt.Println(t)
// Output:
// 2014-12-31 12:31:24 +0900 JST


Unix TimeStampから変換

fmt.Println(time.Unix(1419933529, 0))

// Output:
// 2014-12-30 09:58:49 +0000 UTC

http://play.golang.org/p/JtGB0MLKyx

第2引数でナノ秒を指定できる。


時刻の編集

時刻の操作や差分を確認する場合、Duration型を取り扱うことになる。中身はint64。

type Duration int64

明示的にDuration型を使うことによって、時刻操作していることをわかりやすくできる。

fmt.Println(reflect.TypeOf(1))               // int

fmt.Println(reflect.TypeOf(1 * time.Second)) // time.Duration
fmt.Println(reflect.TypeOf(1 * time.Hour)) // time.Duration

http://play.golang.org/p/TuxwkzdBkJ


○○後の時刻を取得する

fmt.Println(t) // 2014-12-20 00:00:00 +0900 JST

t2 := t.Add(1 * time.Minute) // 1分後
fmt.Println(t2) // 2014-12-20 00:01:00 +0900 JST

t3 := t.Add(1 * time.Hour) // 1時間後
fmt.Println(t3) // 2014-12-20 01:00:00 +0900 JST

t4 := t.Add(24 * time.Hour) // 1日後 (time.Dayは標準には無い)
fmt.Println(t4) // 2014-12-21 00:00:00 +0900 JST

http://play.golang.org/p/vy_l5cJlHL

1日後の場合はtime.AddDate()

fmt.Println(t) // 2014-12-20 00:00:00 +0900 JST

t2 := t.AddDate(0, 0, 1) // 1日後
fmt.Println(t2) // 2014-12-21 00:00:00 +0900 JST

t3 := t.AddDate(0, 1, 0) // 1ヶ月後
fmt.Println(t3) // 2015-01-20 00:00:00 +0900 JST

t4 := t.AddDate(1, 0, 0) // 1年後
fmt.Println(t4) // 2015-12-20 00:00:00 +0900 JST

http://play.golang.org/p/iWF0DG-_St


○○前の時刻を取得する

time.Add()に-を入れられる

fmt.Println(t) // 2014-12-20 00:00:00 +0900 JST

t2 := t.Add(-time.Minute) // 1分前
fmt.Println(t2) // 2014-12-19 23:59:00 +0900 JST

t3 := t.Add(-time.Hour) // 1時間前
fmt.Println(t3) // 2014-12-19 23:00:00 +0900 JST

t4 := t.Add(-24 * time.Hour) // 1日前
fmt.Println(t4) // 2014-12-19 00:00:00 +0900 JST

http://play.golang.org/p/5HcqtJN1o6

time.AddDate()でマイナスを入れれば過去になる

fmt.Println(t) // 2014-12-20 00:00:00 +0900 JST

t2 := t.AddDate(0, 0, -1) // 1日前
fmt.Println(t2) // 2014-12-19 00:00:00 +0900 JST

t3 := t.AddDate(0, -1, 0) // 1ヶ月前
fmt.Println(t3) // 2014-11-20 00:00:00 +0900 JST

t4 := t.AddDate(-1, 0, 0) // 1年前
fmt.Println(t4) // 2013-12-20 00:00:00 +0900 JST

http://play.golang.org/p/Vki9YrIwWU


2つの時刻を比較する

t1 := time.Date(2014, 12, 20, 12, 0, 0, 0, loc)

fmt.Println(t1) // 2014-12-20 12:00:00 +0900 JST

t2 := time.Date(2014, 12, 20, 0, 0, 0, 0, loc)
fmt.Println(t2) // 2014-12-20 00:00:00 +0900 JST

fmt.Println(t1.Sub(t2)) // 12h0m0s

http://play.golang.org/p/dbaEeuxHof


現在時刻からどれだけ前か調べる

loc, _ := time.LoadLocation("Asia/Tokyo")

t1 := time.Date(2009, 11, 8, 8, 0, 0, 0, loc)
d := time.Since(t1)
fmt.Println(d) // 72h0m0s (Go Playgroundで実行した場合)

http://play.golang.org/p/X8ruti5dvc

time.Since(t)time.Now().Sub(t)の省略形。


参考