休日に限って起きられない

休日は昼まで寝てしまう人のブログです

Golang における時刻の扱い自分用まとめ

最近Goで日付を扱うことが多くその度に毎回フォーマットをググっていたので自分用メモ。

フォーマットの定義文字列が「2006-01-02 15:04:05」なのは分かりやすいっちゃ分かりやすいけど分かりにくいっちゃ分かりにくい。

Goのtimeパッケージのリファレンスタイム(2006年1月2日)は何の日? - Qiita

時刻の扱いまとめ

よく使うのは

  • 文字列をパースしてtime.Time型に変換
  • 時刻(time.Time型)から文字列に変換
  • 時刻の加算

かな。 切り捨てもたまに使う。

package main

import (
    "fmt"
    "time"
)

func main() {
    // 現在時刻の取得
    t := time.Now()
    fmt.Println(t) // 2020-01-28 17:28:45.081013 +0900 JST m=+0.000171794

    // 任意の日時をセット
    t = time.Date(2020, 1, 28, 17, 5, 7, 0, time.Local)
    fmt.Println(t) // 2020-01-28 17:05:07 +0900 JST

    // 文字列をパースしてtime.Time型を生成する
    t, _ = time.Parse("2006-01-02 15:04:05", "2020-01-28 17:04:07")
    fmt.Println(t)         // 2020-01-28 17:04:07 +0000 UTC
    fmt.Println(t.Local()) // 2020-01-29 02:04:07 +0900 JST

    t, _ = time.Parse("2006年01月02日 15時04分05秒", "2020年01月28日 17時04分07秒")
    fmt.Println(t)         // 2020-01-28 17:04:07 +0000 UTC
    fmt.Println(t.Local()) // 2020-01-29 02:04:07 +0900 JST

    // 時刻から文字列を生成する
    t = time.Now()
    fmt.Println(t.Format("2006/01/02"))            // 2020/01/28
    fmt.Println(t.Format("2006-01-02 15:04:05"))   // 2020-01-28 17:28:45
    fmt.Println(t.Format("2006年01月02日 15時04分05秒")) // 2020年01月28日 17時28分45秒

    // 加算
    t = time.Now()
    t = t.AddDate(0, 0, 7)
    fmt.Println(t) // 2020-02-04 17:28:45.081722 +0900 JST

    t = time.Now()
    t = t.Add(time.Duration(60*60*24*7) * time.Second) // 604800秒 = 1週間の加算
    fmt.Println(t)                                     // 2020-02-04 17:28:45.081727 +0900 JST m=+604800.000885424

    // 切り捨て
    t = time.Now()
    fmt.Println(t) // 2020-01-28 17:28:45.081735 +0900 JST m=+0.000893621

    t = t.Truncate(time.Nanosecond)
    fmt.Println(t) // 2020-01-28 17:28:45.081735 +0900 JST

    t = t.Truncate(time.Millisecond)
    fmt.Println(t) // 2020-01-28 17:28:45.081 +0900 JST

    t = t.Truncate(time.Second)
    fmt.Println(t) // 2020-01-28 17:28:45 +0900 JST

    t = t.Truncate(time.Hour)
    fmt.Println(t) // 2020-01-28 17:00:00 +0900 JST
}