Goの日付フォーマットでミリ秒、マイクロ秒、ナノ秒を取得するには

Goの`time`パッケージで日時をフォーマットする際は、米国の日付表記の順番を記載すると対応する文字列が取得可能となっている。


```go:main.go
package main

import (
	"fmt"
	"time"
)

func main() {
	t := time.Date(2020, 2, 3, 14, 26, 31, 123456789, time.Local)
	fmt.Println(t.Format("2006/01/02 15:04:05"))
}
```

実行した結果はこんな感じ。

```:terminal
$ go run get_nanoseconds/main.go
2020/02/03 14:26:31
```

# ミリ秒、マイクロ秒、ナノ秒を取得する

`time`のフォーマットに使えるフォーマット用文字列は下記の通りとなっている。

https://golang.org/src/time/format.go より

```go
const (
	_                        = iota
	stdLongMonth             = iota + stdNeedDate  // "January"
	stdMonth                                       // "Jan"
	stdNumMonth                                    // "1"
	stdZeroMonth                                   // "01"
	stdLongWeekDay                                 // "Monday"
	stdWeekDay                                     // "Mon"
	stdDay                                         // "2"
	stdUnderDay                                    // "_2"
	stdZeroDay                                     // "02"
	stdUnderYearDay                                // "__2"
	stdZeroYearDay                                 // "002"
	stdHour                  = iota + stdNeedClock // "15"
	stdHour12                                      // "3"
	stdZeroHour12                                  // "03"
	stdMinute                                      // "4"
	stdZeroMinute                                  // "04"
	stdSecond                                      // "5"
	stdZeroSecond                                  // "05"
	stdLongYear              = iota + stdNeedDate  // "2006"
	stdYear                                        // "06"
	stdPM                    = iota + stdNeedClock // "PM"
	stdpm                                          // "pm"
	stdTZ                    = iota                // "MST"
	stdISO8601TZ                                   // "Z0700"  // prints Z for UTC
	stdISO8601SecondsTZ                            // "Z070000"
	stdISO8601ShortTZ                              // "Z07"
	stdISO8601ColonTZ                              // "Z07:00" // prints Z for UTC
	stdISO8601ColonSecondsTZ                       // "Z07:00:00"
	stdNumTZ                                       // "-0700"  // always numeric
	stdNumSecondsTz                                // "-070000"
	stdNumShortTZ                                  // "-07"    // always numeric
	stdNumColonTZ                                  // "-07:00" // always numeric
	stdNumColonSecondsTZ                           // "-07:00:00"
	stdFracSecond0                                 // ".0", ".00", ... , trailing zeros included
	stdFracSecond9                                 // ".9", ".99", ..., trailing zeros omitted

	stdNeedDate  = 1 << 8             // need month, day, year
	stdNeedClock = 2 << 8             // need hour, minute, second
	stdArgShift  = 16                 // extra argument in high bits, above low stdArgShift
	stdMask      = 1<<stdArgShift - 1 // mask out argument
)
```

## 0埋めした値を取得

0埋めしたミリ秒、マイクロ秒、ナノ秒を取得する場合はこの内、`stdFracSecond0`を利用して`.000・・・`という文字列を設定する。

```go:main.go
// 抜粋
func main() {
	t := time.Date(2020, 2, 3, 14, 26, 31, 123456700, time.Local)

	fmt.Println(t.Format("2006/01/02 15:04:05.000")) // ミリ秒
	fmt.Println(t.Format("2006/01/02 15:04:05.000000")) // マイクロ秒
	fmt.Println(t.Format("2006/01/02 15:04:05.000000000")) // ナノ秒
}
```

実行結果

```:terminal
$ go run get_nanoseconds/main.go
2020/02/03 14:26:31.123
2020/02/03 14:26:31.123456
2020/02/03 14:26:31.123456700
```

## 0埋めしない値を取得

上記例では`.000・・・`という形で記載したが、`stdFracSecond9 `で定義されている記述の`.999・・・`と書くことでもミリ秒以下を取得可能である。
この場合、表示最終桁から`0`が続いている場合は0埋めされずに表示から除外される。

```go:main.go
// 抜粋
func main() {
	t := time.Date(2020, 2, 3, 14, 26, 31, 123456700, time.Local)

	fmt.Println(t.Format("2006/01/02 15:04:05.999999999"))
}
```

実行結果

```:terminal
$ go run get_nanoseconds/main.go
2020/02/03 14:26:31.1234567
```

# サンプル

下記にもサンプルコードを記載しておきます。
https://github.com/ayatothos/go-samples/blob/master/get_nanoseconds/main.go