Help us understand the problem. What is going on with this article?

Goで時刻を取り扱う

More than 3 years have 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)の省略形。

参考

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした