この記事はGo Advent Calendar 2016 - Qiitaの7日目の記事です。 apexの話でもしようと思ったのですが時間がなく別の記事を書くことにしました。
Golangを仕事で書き始めて、もう丸2年になりますが、未だに必要になると毎回ググって調べてから利用するものがあります。 その一つがtime
パッケージのフォーマットです。 GolangではいわゆるYYYYMMDD
のような形式ではなく20060102
といった特定の日時をベースにした文字列で表す必要があります。
123の順で振られていること、2006年なこと等なんとなくは覚えてきているのですが、確認をしないと不安で仕方なくなります。
この2年間で最低でも10回以上はgolang time format
でググり、その度にmattnさんの記事に辿り着いていました。 同じ記事を何度も見るのは自分に負けた気になるので悲しいです。
Golangの本家の実装を見るとわかるのですがtime/format.goの130行目あたりのnextStdChunk
という関数でパースをしています。
これを基に判別表を作成しました。
format | about |
---|---|
January | Month(long) |
Jan | Month(short) |
1 | Month Number |
01 | Month Number(zero埋め) |
Monday | WeekDay(long) |
Mon | WeekDay(short) |
2 | Day |
_2 | Day(space埋め) |
02 | Day(zero埋め) |
15 | Hour(24h) |
3 | Hour(12h) |
03 | Hour(12h,zero埋め) |
4 | Minute |
04 | Minute(zero埋め) |
5 | Second |
05 | Second(zero埋め) |
2006 | Year(long) |
06 | Year(short) |
PM | AM or PM |
pm | am or pm |
MST | TimeZone |
Z0700 | ISO8601TZ |
Z070000 | ISO8601TZ(seconds) |
Z07 | ISO8601TZ(short) |
Z07:00 | ISO8601TZ(colon) |
Z07:00:00 | ISO8601TZ(seconds/colon) |
-0700 | NumTimeZone |
-070000 | NumTimeZone(seconds) |
-07 | NumTimeZone(short) |
-07:00 | NumTimeZone(colon) |
-07:00:00 | NumTimeZone(seconds/colon) |
.0, .00, .000, ... | FracSecond(trailing zeros included) |
.9, .99, .999, ... | FracSecond(trailing zeros omitted) |
またさっとYYYYMMDDで書いた時ものを置換したりしたいので、その場合のための簡単なツールを作成しました。
$ go get github.com/yudppp/gotimefmt/cmd/gotimefmt
$ gotimefmt YYYYMMDD
------------------------------------
format: 20060102
now: 20161206
------------------------------------
のようにさっとFormatと現在時間を出力されるようにしました。
timeのformatに悩まされずに済むようになりたいです。