Golangでの日付のフォーマット指定の方法について

  • 34
    いいね
  • 1
    コメント
この記事は最終更新日から1年以上が経過しています。

Golangで単純に日付のフォーマットに変更しようとしただけなんですがちょっとハマったのでそのメモです。(以下では、packageimportは適切に宣言されているものとして説明をします。)

例えば、今日の日付を特定のフォーマットに変更する場合を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のこの指定方法はちょっと気持ちわるいなと思ってしまいました。なんでこのような分かりにくいものになっているんでしょうか?それともこれが普通なんですかね。もしもこの理由を知っている方がいたら教えてください。

参照