6
0

More than 1 year has passed since last update.

Goの日付フォーマットは0埋めしない24時間表記を作れない

Last updated at Posted at 2023-08-25

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桁の月に置き換わる、といった感じです。

詳しいことは下記の記事などを参考にしてください。

時間の書式について

時間の書式については次のようになっています(公式ドキュメントから抜粋)。

Hour: "15" "3" "03" (PM or AM)
Minute: "4" "04"
Second: "5" "05"
AM/PM mark: "PM"

0をつけて03などとすると、0埋めした2桁の値になります。
しかし、時間(Hour)の24時間表記の方は15しか定義されておらず、これだけで0023までの値にフォーマットされます。
先頭に0をつけて015(それも変ですが)としたわけでもないのに、最初から0埋めされた表現になります。

では0埋めしない24時間表記にしたい場合はどう指定すればよいのかというと、そんな指定は存在しないようです。

どうすればよいか

機能が提供されていない以上はどうしようもないので、私は時間の部分だけfmt.Sprintf()で組み立てることにしました。

timePart := fmt.Sprintf("%d:%02d", d.Hour(), d.Minute())

参考

6
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
0