※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/
最後までお読みいただきありがとうございました!
