Go言語入門 vol.3 – 日付操作 –

※Go言語入門のindexページはこちら

こんにちは。オガリア開発チームの粂です。

今回はGoの日付操作周りについて調べたことを書こうと思います。

Goのバージョン:1.1.2

現在の日時を取得する

package main

import (
	"fmt"
	"time"
)

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

現在の年、月、日、時、分、秒を取得する

package main

import (
	"fmt"
	"time"
)

func main() {
	now := time.Now()
	fmt.Println(now.Year())
	fmt.Println(now.Month()
	fmt.Println(now.Day())
	fmt.Println(now.Hour())
	fmt.Println(now.Minute())
	fmt.Println(now.Second())
}

現在の曜日を取得する

package main

import (
	"fmt"
	"time"
)

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

1秒後を取得する

package main

import (
	"fmt"
	"time"
)

func main() {
	now := time.Now()
	fmt.Println(now.Add(time.Duration(1) * time.Second))
}

1分後を取得する

package main

import (
	"fmt"
	"time"
)

func main() {
	now := time.Now()
	fmt.Println(now.Add(time.Duration(1) * time.Minute))
}

1時間後を取得する

package main

import (
	"fmt"
	"time"
)

func main() {
	now := time.Now()
	fmt.Println(now.Add(time.Duration(1) * time.Hour))
}

1日後を取得する

package main

import (
	"fmt"
	"time"
)

func main() {
	now := time.Now()
	fmt.Println(now.Add(time.Duration(24) * time.Hour))
}

あるいは

package main

import (
	"fmt"
	"time"
)

func main() {
	now := time.Now()
	fmt.Println(now.AddDate(0, 0, 1))
}

1ヶ月後を取得する

package main

import (
	"fmt"
	"time"
)

func main() {
	now := time.Now()
	fmt.Println(now.AddDate(0, 1, 0))
}

1年後を取得する

package main

import (
	"fmt"
	"time"
)

func main() {
	now := time.Now()
	fmt.Println(now.AddDate(1, 0, 0))
}

先月初日/末日を取得する
初日はそのままなんですが、末日は翌月の初日を取得してそこから1日戻すというやり方。他の言語でも同じようなことしますね。

package main

import (
	"fmt"
	"time"
)

func main() {
	now := time.Now()
	firstDay := time.Date(now.Year(), now.Month()-1, 1, 0, 0, 0, 0, now.Location())
	lastDay := time.Date(now.Year(), now.Month(), 1, 0, 0, 0, 0, now.Location()).AddDate(0, 0, -1)
	fmt.Println(firstDay)
	fmt.Println(lastDay)
}

今月初日/末日を取得する
先月と同じ要領です。

package main

import (
	"fmt"
	"time"
)

func main() {
	now := time.Now()
	firstDay := time.Date(now.Year(), now.Month(), 1, 0, 0, 0, 0, now.Location())
	lastDay := time.Date(now.Year(), now.Month()+1, 1, 0, 0, 0, 0, now.Location()).AddDate(0, 0, -1)
	fmt.Println(firstDay)
	fmt.Println(lastDay)
}

来月初日/末日を取得する
しつこいですか。

package main

import (
	"fmt"
	"time"
)

func main() {
	now := time.Now()
	firstDay := time.Date(now.Year(), now.Month()+1, 1, 0, 0, 0, 0, now.Location())
	lastDay := time.Date(now.Year(), now.Month()+2, 1, 0, 0, 0, 0, now.Location()).AddDate(0, 0, -1)
	fmt.Println(firstDay)
	fmt.Println(lastDay)
}

Time型の値が24時間以上前かどうかを確認する
24時間経過していたらとか、30日経過していたらとか、ありがちだと思いますが、Since使うといい感じに書けます。

package main

import (
	"fmt"
	"time"
)

func main() {
	target := time.Now().AddDate(0, 0, -1)
	expireDate := time.Duration(24) * time.Hour
	fmt.Println(time.Since(target) >= expireDate) //=>true
}

Time型の値が指定した期間内に含まれるかどうかを確認する
AfterとBeforeを組み合わせればいい感じに書けます。

package main

import (
	"fmt"
	"time"
)

func main() {
	target := time.Now()
	tomorrow := target.AddDate(0, 0, 1)
	yesterday := target.AddDate(0, 0, -1)
	fmt.Println(target.After(tomorrow))   //=> false
	fmt.Println(target.After(yesterday))  //=> true
	fmt.Println(target.Before(tomorrow))  //=> true
	fmt.Println(target.Before(yesterday)) //=> false
}

参考サイト
http://golang.org/pkg/time/

最後までお読みいただきありがとうございました!

Pocket