Golang 日付のフォーマットでハマった話
プログラミング
Published: 2016-05-16

Qiitaから移動させたコンテンツです。

Golangで日付のフォーマットを指定するにはtimeのFormatを使用するのだが
graphite-api用に以下のフォーマットにする必要があった。

しかしなぜかうまく動作する環境としない環境があって時間をドブに捨てた話。
結論からいうと、不具合だったよう?です。golangのバージョンアップで直りました。

フォーマットの指定について

指定フォーマット  HH:SS_YYYYMMDD
なので、Golangとしては Format("15:04_20060102")

テストコード

package main

import (
        "fmt"
        "time"
)

func main() {
        now := time.Now()
        fmt.Printf("now=%v, formatted=%s\n", now, now.Format("15:04_20060102"))
}

1.6.2の場合

# go run main.go
now=2016-05-16 17:14:54.851096532 +0900 JST, formatted=17:14_20160516

1.5.1の場合

# go run main.go
now=2016-05-16 17:13:45.995101638 +0900 JST, formatted=17:13160160516

15:04_20060102の_2の部分が日付のstdUnderDayとして認識されてしまっている模様。
https://github.com/golang/go/blob/master/src/time/format.go#L82

教えていただいたのですが、1.6.1ぐらいで修正されている模様です。
https://github.com/golang/go/commit/f4b4d2f4d9f574fe34b826bf0e6784956a247687

とりあえず、自分の環境も1.6.2にアップデートすることにします。