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メソッドに指定する形式が決まっているようなことがドキュメントに書かれていた。
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
他にも定形フォーマットは定義されている。
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" )