dshimizu/blog

アルファ版

GoのTimeパッケージの日時フォーマットを指定するときは「2006年1月2日15時04分05秒」の日時を利用する必要があった

GoでTimeパッケージを使って日時のフォーマットを変更するときの形式は決まっていたのでメモ書き。

例えば以下のようなコードを使って現在時刻を取得する。

package main

import (
    "fmt"
    "time"
)

func main() {
    fmt.Println(time.Now())
}

これを実行すると以下のような出力になる。

% go run time.go
2020-05-02 16:22:41.773538 +0900 JST m=+0.000083111

これを例えば年月日だけを「YYYY年MM月DD日」という形式で取得しようと思うと、以下のようにする必要がある。

package main

import (
    "fmt"
    "time"
)

func main() {
    fmt.Println(time.Now().Format("2006年01月02日"))
}

これを実行すると以下のようになる。

% go run time.go
2020年05月02日

経緯

最初、Formatで指定する形式はなんでも良いのかと思って以下のようにした。

package main

import (
    "fmt"
    "time"
)

func main() {
    fmt.Println(time.Now().Format("2020年01月01日"))
}

すると出力が以下のようなものになってしまった。

% go run time.go
20200年05月05日

そこで調べたらFormatメソッドに指定する形式が決まっているようなことがドキュメントに書かれていた。

  • time - The Go Programming Language
  • These are predefined layouts for use in Time.Format and time.Parse. The reference time used in the layouts is the specific time:
    
    Mon Jan 2 15:04:05 MST 2006
    
    which is Unix time 1136239445. Since MST is GMT-0700, the reference time can be thought of as
    
    01/02 03:04:05PM '06 -0700
    

他にも定形フォーマットは定義されている。

  • go/format.go at master · golang/go
  • const (
        ANSIC       = "Mon Jan _2 15:04:05 2006"
        UnixDate    = "Mon Jan _2 15:04:05 MST 2006"
        RubyDate    = "Mon Jan 02 15:04:05 -0700 2006"
        RFC822      = "02 Jan 06 15:04 MST"
        RFC822Z     = "02 Jan 06 15:04 -0700" // RFC822 with numeric zone
        RFC850      = "Monday, 02-Jan-06 15:04:05 MST"
        RFC1123     = "Mon, 02 Jan 2006 15:04:05 MST"
        RFC1123Z    = "Mon, 02 Jan 2006 15:04:05 -0700" // RFC1123 with numeric zone
        RFC3339     = "2006-01-02T15:04:05Z07:00"
        RFC3339Nano = "2006-01-02T15:04:05.999999999Z07:00"
        Kitchen     = "3:04PM"
        // Handy time stamps.
        Stamp      = "Jan _2 15:04:05"
        StampMilli = "Jan _2 15:04:05.000"
        StampMicro = "Jan _2 15:04:05.000000"
        StampNano  = "Jan _2 15:04:05.000000000"
    )
    

参考