m_shige1979のときどきITブログ

プログラムの勉強をしながら学習したことや経験したことをぼそぼそと書いていきます

Github(変なおっさんの顔でるので気をつけてね)

https://github.com/mshige1979

golangの学習(time)

日時に関する情報を制御する

timeパッケージを使用する

現在日時を取得する

sample
package main

import (
    "fmt"
    "time"
)

func main(){
    _now := time.Now()
    fmt.Println(_now)
}

$ go run time1.go
2016-01-19 22:46:07.181469119 +0900 JST
$

日時を任意のフォーマットで表示する

https://golang.org/src/time/format.go
※フォーマットの指定値がややこしいので気をつけないといけない

sample
package main

import (
    "fmt"
    "time"
)

func main(){
    // 現在日時を取得
    _now := time.Now()

    // format
    const YYYYMMDDHHMISS1 = "2006/01/02 15:04:05"
    const YYYYMMDDHHMISS2 = "06-1-2 3:4:5"

    fmt.Println(_now.Format(YYYYMMDDHHMISS1))
    fmt.Println(_now.Format(YYYYMMDDHHMISS2))
    fmt.Println(_now.Format(time.RFC3339))
}

$ go run time2.go
2016/01/19 22:56:21
16-1-19 10:56:21
2016-01-19T22:56:21+09:00
$

Unixタイムスタンプの秒数を取得

ちょっと意味は違うかも…

sanmple
package main

import (
    "fmt"
    "time"
)

func main(){
    _now := time.Now()
    fmt.Println(_now.Unix())
    fmt.Println(_now.UnixNano())
}

$ go run time3.go
1453212000
1453212000553662868
$

日付加算

日数、月数、年数を指定して加算、減算を行う

sample
package main

import (
    "fmt"
    "time"
)

func main(){
    // 現在の日時を取得
    _now := time.Now()
    fmt.Println(_now)
    fmt.Println("")

    // 日付計算
    fmt.Println(_now.AddDate(0, 0, 10).Format(time.RFC3339))
    fmt.Println(_now.AddDate(0, 2, 0).Format(time.RFC3339))
    fmt.Println(_now.AddDate(5, 0, 0).Format(time.RFC3339))

    fmt.Println("")

    fmt.Println(_now.AddDate(0, 0, -10).Format(time.RFC3339))
    fmt.Println(_now.AddDate(0, -2, 0).Format(time.RFC3339))
    fmt.Println(_now.AddDate(-5, 0, 0).Format(time.RFC3339))
}

$ go run time5.go
2016-01-19 23:06:58.719504358 +0900 JST

2016-01-29T23:06:58+09:00
2016-03-19T23:06:58+09:00
2021-01-19T23:06:58+09:00

2016-01-09T23:06:58+09:00
2015-11-19T23:06:58+09:00
2011-01-19T23:06:58+09:00
$

時間加算

時間を指定して加算、減算を行う

sample
package main

import (
    "fmt"
    "time"
)

func main(){
    // 現在の日時を取得
    _now := time.Now()
    fmt.Println(_now)
    fmt.Println("")

    // 日付計算
    fmt.Println(_now.Add(time.Duration(25) * time.Second).Format(time.RFC3339))
    fmt.Println(_now.Add(time.Duration(12) * time.Minute).Format(time.RFC3339))
    fmt.Println(_now.Add(time.Duration(05) * time.Hour).Format(time.RFC3339))

    fmt.Println("")

    fmt.Println(_now.Add(time.Duration(-25) * time.Second).Format(time.RFC3339))
    fmt.Println(_now.Add(time.Duration(-12) * time.Minute).Format(time.RFC3339))
    fmt.Println(_now.Add(time.Duration(-05) * time.Hour).Format(time.RFC3339))
}

$ go run time6.go
2016-01-19 23:13:56.686245405 +0900 JST

2016-01-19T23:14:21+09:00
2016-01-19T23:25:56+09:00
2016-01-20T04:13:56+09:00

2016-01-19T23:13:31+09:00
2016-01-19T23:01:56+09:00
2016-01-19T18:13:56+09:00
$

文字列を任意のレイアウトより日付に変換

sample
package main

import (
    "fmt"
    "time"
)

func main(){
    _date, _err := time.Parse("2006-01-02 15:04:05", "2001-10-23 15:54:20")
    if _err != nil {
        panic(_err)
    }
    fmt.Println(_date)
}

$ go run time7.go
2001-10-23 15:54:20 +0000 UTC
$

2つの日時より差を取得する

sample
package main

import (
    "fmt"
    "time"
)

func main(){
    // 2つの日時を設定
    _date1, _ := time.Parse("2006-01-02 15:04:05", "2001-10-23 15:54:20")
    _date2, _ := time.Parse("2006-01-02 15:04:05", "2002-10-23 15:54:20")

    // 差を取得する
    _d := _date2.Sub(_date1)

    // 差を出力する
    fmt.Println(_d)
}

$ go run time8.go
8760h0m0s
$

まあ、こんな感じ

所感

使いそうなものをとりあえず、調べてみた。
日付のフォーマットでちょっとつまづきそうだけど基本は抑えた感じ…多分
基本、手続き型言語の仕事が多すぎた分、慣れるのがちょっと大変かも