Goのtimeパッケージのフォーマットは独特だ。普通のUnixのstrftimeとかだとフォーマット文字列は%Yとか%mといった文字列なのだけど、Goの場合はそのかわりにある種の「サンプル文字列」を与えるという仕組みになっている。
たとえば次の文字列はGoでは時刻の正しいフォーマット文字列だ。
const RFC1123Z = "Mon, 02 Jan 2006 15:04:05 -0700"
%Y(年)の代わりに"2006"、%b(月の名前)の代わりに"Jan"と書くといったルールになっている。"%Y-%m-%d"の代わりに"2006-01-02"と書くのは見た目にわかりやすいといえばわかりやすいが、"2006年1月2日15時04分05秒"以外の時刻は正しいフォーマット文字列としては認識されない。2006の代わりに2007とか書いても意味がない。
では一体この2006年1月2日という特別な日は、なんの日なのか?
最初は1970年1月1日(エポック)から特定の時間が経過した日だとか、あるいはGoが最初に作られた日ではないかと思ったが、それは考えすぎだった。
答えは単純だ。これはアメリカ式の時刻の順番なのだ。"1月2日午後3時4分5秒2006年"(つまり「自然な順番」で1, 2, 3, 4, 5, 6)を指しているのである。Go開発者のRob Pikeさんがgolang-nutsメーリングリストで、最初からよく考えていればこの順番にはしなかったと言っていたが(英語圏でもイギリスとかだと違う順番だしね)、もうその順番になっているので変えられないし、それにきちんと文章化もされているともコメントしていた。従ってこれは単純にそういうものだと思うしかなさそうだ。