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

Goのtimeパッケージチートシート

はじめに

以下は 2018年3月に実行した結果です。
go1.9.2を使用しています

現在時刻を取得

ʕ◔ϖ◔ʔ
// tはtime.Time型
t := time.Now()
fmt.Println(t) // 2018-03-03 17:44:13.936106 +0900 JST m=+0.000309812

t = time.Date(2018, 3, 3, 17, 44, 13, 0, time.Local)
fmt.Println(t)              // 2018-03-03 17:44:13 +0900 JST
fmt.Println(t.Year())       // 2018
fmt.Println(t.YearDay())    // 62 通算日(1~366)
fmt.Println(t.Month())      // March
fmt.Println(t.Weekday())    // Saturday
fmt.Println(t.Day())        // 3
fmt.Println(t.Hour())       // 17
fmt.Println(t.Minute())     // 44
fmt.Println(t.Second())     // 13
fmt.Println(t.Nanosecond()) // 0
fmt.Println(t.Zone())       // JST 32400

月・曜日

Go
// 月は1からの連番
if time.January == 1 {

  /*
  * ※ time.goパッケージにて定数を定義しているが、String()を実装している為、Printlnの出力は数値ではない
  */
  fmt.Println(time.January)  // January
  fmt.Println(time.December) // December
}

// 曜日は日曜日から0スタートの連番
if time.Sunday == 0 {
  fmt.Println(time.Sunday)   // Sunday
  fmt.Println(time.Saturday) // Saturday
}

// 日本語化
wdays := [...]string{"日", "月", "火", "水", "木", "金", "土"}
fmt.Println(wdays[t.Weekday()]) // 水

文字列をパースしてtime.Time型を生成

func ParseDuration(s string) (Duration, error)

Go
t, _ := time.ParseDuration("1h30m")
fmt.Println(t.Minutes()) // 90

時刻の加算

func (t Time) Add(d Duration) Time

Go
t = time.Date(2017, 12, 31, 23, 59, 59, 0, time.Local)
fmt.Println(t) // 2017-12-31 23:59:59 +0900 JST

t = t.Add(1 * time.Second)
fmt.Println(t) // 2018-01-01 00:00:00 +0900 JST

時刻の差分

Go
// 今年が終わるまでの時間を取得
t := time.Date(2019, 12, 31, 23, 59, 59, 999999999, time.Local)
sub := t.Sub(time.Now())
fmt.Println(sub) // 6535h3m18.242705936s

// time.Sinceはtime.Now().Sub(t)のラッパー
sub = time.Since(t)
fmt.Println(sub) // -6535h3m18.24254996s

sub *= -1
fmt.Println(sub) // 6535h3m18.24254996s

https://wandbox.org/permlink/EnshE7FFt707Is6W

年・月・日の加算

Go
t = time.Date(2018, 12, 31, 23, 59, 59, 999999999, time.Local)
t = t.AddDate(0, 0, 1) // AddDate(y,m,d)
fmt.Println(t)         // 2019-01-01 23:59:59.999999999 +0900 JST

月末を取得

2018年3月に実行した結果です

Go
y := time.Now().Year()
m := time.Now().Month() // type Month int

t := time.Date(y, m, 1, 23, 59, 59, 999999999, time.Local).AddDate(0, 1, -1)

fmt.Println(t) // 2018-03-31 23:59:59.999999999 +0900 JST
月末取得を関数化
y := time.Now().Year()
m := time.Now().Month() // type Month int

// Month型なのでcastが必要
t := GetLastDate(y, int(m))

func GetLastDate(year, month int) time.Time {
    return time.Date(year, time.Month(month+1), 1, 23, 59, 59, 999999999, time.Local).AddDate(0, 0, -1)
}
3ヶ月前の月末を取得
y := time.Now().Year()
m := time.Now().Month() // type Month int
t := time.Date(y, m, 1, 23, 59, 59, 999999999, time.Local).AddDate(0, -2, -1)

fmt.Println(t) // 2017-12-31 23:59:59.999999999 +0900 JST
ex)先月末を取得。dayを0にすると先月末の最終日が返る(危険な香り)
y := time.Now().Year()
m := time.Now().Month() // type Month int
t := time.Date(y, m, 0, 23, 59, 59, 999999999, time.Local)

fmt.Println(t) // 2018-02-28 23:59:59.999999999 +0900 JST

時刻の比較

Go
Jan := time.Date(2018, 1, 1, 0, 0, 0, 0, time.Local)
Feb := time.Date(2018, 2, 1, 0, 0, 0, 0, time.Local)
fmt.Println(Jan.Before(Feb)) // true  (1月は2月よりも前か?)
fmt.Println(Jan.After(Feb))  // false (1月は2月よりも後か?)

文字列から時刻を生成

func Parse(layout, value string) (Time, error)

Go
var t = time.Time{}
t, _ = time.Parse("2006/01/02", "2018/03/03")
fmt.Println(t) // 2018-03-03 00:00:00 +0000 UTC

t, _ = time.Parse("2006年01月02日 15時04分05秒", "2018年03月03日 20時01分30秒")

fmt.Println(t)         // 2018-03-03 20:01:30 +0000 UTC
fmt.Println(t.Local()) // 2018-03-04 05:01:30 +0900 JST

時刻から文字列を生成

Go
t := time.Now()
fmt.Println(t)                                     // 2018-03-22 00:07:47.454560551 +0900 JST m=+0.001143095
fmt.Println(t.Format(time.RFC822))                 // 22 Mar 18 00:07 JST
fmt.Println(t.Format(time.RFC3339Nano))            // 2018-03-22T00:07:47.454560551+09:00
fmt.Println(t.Format("2006/01/02"))                // 2018/03/22
fmt.Println(t.Format("2006年01月02日 15時04分05秒")) // 2018年03月22日 00時07分47秒

Unix時刻との相互変換

Go
t := time.Now()
fmt.Println(t.Unix())      // 1521644867
fmt.Println(t.UnixNano())  // 1521644867454575129

// UNIXからtime.Timeに変換
t = time.Unix(t.Unix(), 0)
fmt.Println(t)             // 2018-03-22 00:07:47 +0900 JST

参考

Goで時刻を取り扱う
逆引きGolang (日付と時刻)

Why do not you register as a user and use Qiita more conveniently?
  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
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