MyDocs

# Golangで時間操作とソート

インスタンスのCPUをCLIで確認する

この CLI を作るにあたってハマったところとその解決法。

時間でソートする

配列のソート

Golang の場合、お決まりのやり方があるみたいでググると大体同じやり方でやっている。

struct を定義して、Len, Less, Swap メソッドを用意する。

type Bytime []*cloudwatch.Datapoint

func (arr Bytime) Len() int {
	return len(arr)
}

func (arr Bytime) Less(i, j int) bool {
	return arr[i].Timestamp.Before(*arr[j].Timestamp)
}

func (arr Bytime) Swap(i, j int) {
	arr[i], arr[j] = arr[j], arr[i]
}

実際にソートするときは、別の配列を用意した。

var sortedResp Bytime = resp.Datapoints
sort.Sort(sortedResp)

時間の比較

timeA(2020-01-01 00:00:00 +0000 UTC) と timeB(2021-01-01 00:00:00 +0000 UTC) があるとする。

timeA, timeB := time.Date(2020, 1, 1, 0, 0, 0 , 0, time.UTC), time.Date(2021, 1, 1, 0, 0, 0 , 0, time.UTC)

時間の流れは timeA => timeB

このときの時間の比較は以下のようにできる。

timeA.Equal(timeB) // false

timeA.Before(timeB) // true

timeA.After(timeB) // false

UTCをJSTに変更

timeA := time.Date(2020, 1, 1, 0, 0, 0 , 0, time.UTC)
loc, _ := time.LoadLocation("Asia/Tokyo")

fmt.Println("UTC " + timeA.String()) // UTC 2020-01-01 00:00:00 +0000 UTC
fmt.Println("JST " + timeA.In(loc).String()) // JST 2020-01-01 09:00:00 +0900 JST