time.Time の比較が覚えれん!
時刻を表す time
.Time
型は比較演算子(==
, <
, >
等)が使えないので Equal()
, Before()
, After()
各メソッドが用意されているのだけど, Equal()
メソッドはともかく Before()
や After()
は覚えれんっちうの!
まぁドキュメントを見れば済む話なのだが,毎回「どうだっけ?」と探すのもナニなので,この際,記事として纏めておくことにした。
まずはコードを書いてみる。 これ基本。
package main
import (
"fmt"
"time"
)
func main() {
year2000 := time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC)
year3000 := time.Date(3000, 1, 1, 0, 0, 0, 0, time.UTC)
fmt.Printf("year3000.After(year2000) = %v\n", year3000.After(year2000))
fmt.Printf("year3000.Before(year2000) = %v\n", year3000.Before(year2000))
fmt.Printf("year2000.After(year3000) = %v\n", year2000.After(year3000))
fmt.Printf("year2000.Before(year3000) = %v\n", year2000.Before(year3000))
}
これの実行結果は
$ go run sample1.go
year3000.After(year2000) = true
year3000.Before(year2000) = false
year2000.After(year3000) = false
year2000.Before(year3000) = true
となる。
a.After(b)
は「a
は b
の後か?」と覚えればいいかな。
やっぱ面倒くさい。 一覧表にしておこう。
関係 | メソッド | 返り値 |
---|---|---|
$a = b$ | a.Equal(b) | true |
a.Before(b) | false | |
a.After(b) | false | |
$a \lt b$ | a.Equal(b) | false |
a.Before(b) | true | |
a.After(b) | false | |
$a \gt b$ | a.Equal(b) | false |
a.Before(b) | false | |
a.After(b) | true |
【サンプル】時刻のソート
もう少し「ありそう」なサンプルを考えてみよう。
たとえば,以下のようなデータセット eraList
があるとする。
type Era struct {
Name string
Start time.Time
}
var (
jst = time.FixedZone("JST", 9*60*60)
eraList = []Era{
{Name: "令和", Start: time.Date(2019, time.May, 1, 0, 0, 0, 0, jst)},
{Name: "平成", Start: time.Date(1989, time.January, 8, 0, 0, 0, 0, jst)},
{Name: "昭和", Start: time.Date(1926, time.December, 25, 0, 0, 0, 0, jst)},
{Name: "大正", Start: time.Date(1912, time.July, 30, 0, 0, 0, 0, jst)},
}
)
この eraList
を時刻の昇順で並べ替えてみる。
こんな感じかな。
func (e Era) String() string {
return fmt.Sprintf("%s (from %s)", e.Name, e.Start.Format("2006-01-02"))
}
func main() {
fmt.Println(eraList)
sort.Slice(eraList, func(i, j int) bool {
return eraList[i].Start.Before(eraList[j].Start)
})
fmt.Println(eraList)
}
結果は以下の通り。
$ go run sample2.go
[令和 (from 2019-05-01) 平成 (from 1989-01-08) 昭和 (from 1926-12-25) 大正 (from 1912-07-30)]
[大正 (from 1912-07-30) 昭和 (from 1926-12-25) 平成 (from 1989-01-08) 令和 (from 2019-05-01)]
よーし,うむうむ,よーし。
参考図書
- プログラミング言語Go (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)
- Alan A.A. Donovan (著), Brian W. Kernighan (著), 柴田 芳樹 (翻訳)
- 丸善出版 2016-06-20
- 単行本(ソフトカバー)
- 4621300253 (ASIN), 9784621300251 (EAN), 4621300253 (ISBN), 9784621300251 (ISBN)
- 評価
著者のひとりは(あの「バイブル」とも呼ばれる)通称 “K&R” の K のほうである。この本は Go 言語の教科書と言ってもいいだろう。