Goで時刻を取り扱う

Goで時刻を取り扱う場合

# time型を取得する

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

## 現在時刻から取得する

```go
fmt.Println(time.Now())
// Output: 
// 2009-11-10 23:00:00 +0000 UTC
```
http://play.golang.org/p/z5ZRHrVq4T

## 日付から取得する

```go
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](http://golang.org/pkg/time/#Month)で定義されている。
また、引数の最後のlocationは`time.LoadLocation()`などで取得出来る。

```go
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から変換

```go
fmt.Println(time.Unix(1419933529, 0))
// Output:
// 2014-12-30 09:58:49 +0000 UTC
```

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

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

# 時刻の編集

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

```go
type Duration int64
```

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

```go
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


## ○○後の時刻を取得する

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

```go
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()`に-を入れられる

```go
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()`でマイナスを入れれば過去になる

```go
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つの時刻を比較する

```go
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

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

```go
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)`の省略形。

# 参考

* [time - The Go Programming Language](http://golang.org/pkg/time/)