Goで時刻のフォーマットを作る時に、0埋めしない24時間表記(例えば6:15
)が作れないことに気づきました。
06:15
じゃなくて6:15
じゃないとダメなんだ!というのはレアケースなのかなぁ、とも思ったのですが、画面表示や文章の中に入る場合は0埋めしないケースもそれなりにある気がします。
本記事では、どうして作れないのかという解説と代替方法を紹介します。
Goの日付フォーマットについて
Goの日付フォーマットについてのおさらいです。
Goの経験者で既にご存じの方は読み飛ばして結構です。
Goの日付フォーマットは独特なことで有名で、アメリカ式の日付表記で各パートを1から順に振ったものが書式文字列となっています(月、日、時、分、秒、年の順)。
例えばこんな感じです。
"Mon Jan _2 15:04:05 2006"
2006-01-02T15:04:05Z07:00
分かりづらいですが、上記はフォーマットして生成された文字列ではなく、書式文字列です。
例えば2006
と書くと、そこが具体的な年に置き換わり、01
は2桁の月に置き換わる、といった感じです。
詳しいことは下記の記事などを参考にしてください。
- 公式ドキュメント: time package - time - Go Packages
- Goのtimeパッケージのリファレンスタイム(2006年1月2日)は何の日? - Qiita
- Goの日付フォーマット 〜<2006年1月2日>の謎〜 - Hack Your Design!
時間の書式について
時間の書式については次のようになっています(公式ドキュメントから抜粋)。
Hour: "15" "3" "03" (PM or AM)
Minute: "4" "04"
Second: "5" "05"
AM/PM mark: "PM"
0
をつけて03
などとすると、0埋めした2桁の値になります。
しかし、時間(Hour)の24時間表記の方は15
しか定義されておらず、これだけで00
〜23
までの値にフォーマットされます。
先頭に0
をつけて015
(それも変ですが)としたわけでもないのに、最初から0埋めされた表現になります。
では0埋めしない24時間表記にしたい場合はどう指定すればよいのかというと、そんな指定は存在しないようです。
どうすればよいか
機能が提供されていない以上はどうしようもないので、私は時間の部分だけfmt.Sprintf()
で組み立てることにしました。
timePart := fmt.Sprintf("%d:%02d", d.Hour(), d.Minute())