LoginSignup
219
138

More than 5 years have passed since last update.

Goで時刻を取り扱う

Last updated at Posted at 2014-12-30

Goで時刻を取り扱う場合

time型を取得する

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

現在時刻から取得する

fmt.Println(time.Now())
// Output: 
// 2009-11-10 23:00:00 +0000 UTC

日付から取得する

fmt.Println(time.Date(2014, time.December, 31, 12, 13, 24, 0, time.UTC))
// Output:
// 2014-12-31 12:13:24 +0000 UTC

月は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

文字列から取得する

t, _ := time.Parse("2006-01-02", "2014-12-31")
fmt.Println(t)
// Output:
// 2014-12-31 00:00:00 +0000 UTC

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

第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

○○後の時刻を取得する

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

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

○○前の時刻を取得する

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

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

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

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

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で実行した場合)

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

参考

219
138
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
219
138