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) は「ab の後か?」と覚えればいいかな。

やっぱ面倒くさい。 一覧表にしておこう。

関係 メソッド 返り値
$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)]

よーし,うむうむ,よーし。

参考図書

photo
プログラミング言語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 言語の教科書と言ってもいいだろう。

reviewed by Spiegel on 2016-07-13 (powered by PA-APIv5)