🕘

time.Timeの値をn分置きの値にする

2022/04/27に公開

はじめに

今回、初投稿となります。
Inputとして得た知識をOutputするのも大事だな、と思い、今回記事を書いてみることにしました。

普段は、iOS/Androidアプリエンジニアとして、主にSwiftやKotlinで書いていますが、ちょっとしたスクリプト的なものや、プライベートで作るものはGoを使っていたりします。

本題へ...

では本題です。

普段の業務のちょっとした雑務を楽にしたい!ということで、空き時間に地味にコマンドラインツールなどを作っている時でした。

今回は、業務時間の管理/各タスクにかかった時間などを逐一集計し、1日の業務の最後に日報へ載せるテキストを自動生成するツールを作っていました。
その時、私の会社では始業時間/終業時間は15分刻みで計算されるのですが、ふと time.Time の値の分数を15分置きの値にする方法は無いか、ということを調べていましたら、公式ドキュメントにちょうどよいものがありました。

使うメソッドは Truncate() です。

https://pkg.go.dev/time@go1.18.1#Time.Truncate

ソースコード

出力例

$ go run truncate_time.go 9:14
9:14 --(truncate)--> 9:00

$ go run truncate_time.go 9:15
9:15 --(truncate)--> 9:15

$ go run truncate_time.go 9:29
9:29 --(truncate)--> 9:15

$ go run truncate_time.go 9:30
9:30 --(truncate)--> 9:30

time.Time 型の Truncate() メソッドの引数に 15 * time.Minute と指定しています。
これで、15分置きの時間にすることができます。

※最初は Truncate() の処理を自力で書いていましたが、よく公式ドキュメントを見てみたら Example にちゃんと使用例が書いていましたね...

最後に

Go言語はシンプルな言語体系で、公式のドキュメントが充実しているので、学びやすく、すぐに成果物が作れるところが利点だと思います。
また、最近では各種クラウド(AWSとかGCPとか)のサーバーレスのサービスでも対応していることが多く、Webシステム系にも使えるので良いですね!
書いていて楽しい言語の一つだと思います。

また、 go build で実行可能バイナリにすることもできるので、そのままコマンドツールだけがほしい人にも配布ができるのも良いです。

ただシンプルすぎるがゆえに、ちょっとかゆい所に手が届かないところがある...!というのもあるので、ここは一長一短といった感じでしょうか。

最近はRustも勢いがあり、こちらも学んでみたいなと思ったので、そのうち何かツールを作るのにRustを活用してみて、Goと比較なんてのもやってみようかと思います。

本業はiOS/Androidアプリエンジニアなので、KotlinやSwiftのTipsなどもそのうち書くかも...

Discussion