Golangで単純に日付のフォーマットに変更しようとしただけなんですがちょっとハマったのでそのメモです。(以下では、package
、import
は適切に宣言されているものとして説明をします。)
例えば、今日の日付を特定のフォーマットに変更する場合をRubyとGolangとを比較して説明します。
Rubyの場合
Rubyで日付のフォーマットを変更するには以下のように、%
から始まる指定されたフォーマットに従って変換されます。
# 2015-06-12 00:50:19 +0900
Time.now
# 2015-06-12
Time.now.strftime("%Y-%m-%d")
Golangの場合
一方、Golangでは特定の文字列で指定されたフォーマットに従って変換されます。
// 2015-06-12 00:17:10.467238206 +0900 JST
time.Now()
// 2015-06-12
time.Now().Format("2006-01-02")
フォーマットとして指定できるものは以下の通りです。日付のフォーマットに関するより詳しいことは、Source file src/time/format.goに書かれています。
const (
stdLongMonth = "January"
stdMonth = "Jan"
stdNumMonth = "1"
stdZeroMonth = "01"
stdLongWeekDay = "Monday"
stdWeekDay = "Mon"
stdDay = "2"
stdUnderDay = "_2"
stdZeroDay = "02"
stdHour = "15"
stdHour12 = "3"
stdZeroHour12 = "03"
stdMinute = "4"
stdZeroMinute = "04"
stdSecond = "5"
stdZeroSecond = "05"
stdLongYear = "2006"
stdYear = "06"
stdPM = "PM"
stdpm = "pm"
stdTZ = "MST"
stdISO8601TZ = "Z0700" // prints Z for UTC
stdISO8601ColonTZ = "Z07:00" // prints Z for UTC
stdNumTZ = "-0700" // always numeric
stdNumShortTZ = "-07" // always numeric
stdNumColonTZ = "-07:00" // always numeric
)
最後に
自分はRubyのようなフォーマットの指定に慣れていたのでGolangのこの指定方法はちょっと気持ちわるいなと思ってしまいました。なんでこのような分かりにくいものになっているんでしょうか?それともこれが普通なんですかね。もしもこの理由を知っている方がいたら教えてください。