Goにおける日時の書式化と解析
日付の書式変換にはFormatメソッドを用います:
func (t Time) Format(layout string) string
逆に文字列の解析にはtime.Parse関数を使用します:
func Parse(layout, value string) (Time, error)
ここで重要なのはlayoutパラメータで、これは以下のようなマジカルな基準日:
Mon Jan 2 15:04:05 MST 2006
を同じフォーマットで表現したものです。
例:"2017-08-31"を解析する際は、"2006-01-02"というレイアウト文字列を使用します。
入力文字列 := "2017-08-31"
フォーマット指定 := "2006-01-02"
解析結果, _ := time.Parse(フォーマット指定, 入力文字列)
fmt.Println(解析結果) // 2017-08-31 00:00:00 +0000 UTC
fmt.Println(解析結果.Format("02-Jan-2006")) // 31-Aug-2017
なぜMon Jan 2 15:04:05 MST 2006が特別なのか?これを異なる形式で表現してみましょう:
01/02 03:04:05PM '06 -0700
このように各フィールドがすべて異なるため、どのフォーマットでも曖昧さなく識別できます。
よく使われるフォーマット
| Goのフォーマット | Java表記 | C表記 | 備考 |
|---|---|---|---|
| 2006-01-02 | yyyy-MM-dd | %F | ISO 8601 |
| 20060102 | yyyyMMdd | %Y%m%d | ISO 8601 |
| January 02, 2006 | MMMM dd, yyyy | %B %d, %Y | |
| 02 January 2006 | dd MMMM yyyy | %d %B %Y | |
| 02-Jan-2006 | dd-MMM-yyyy | %d-%b-%Y | |
| 01/02/06 | MM/dd/yy | %D | US |
| 01/02/2006 | MM/dd/yyyy | %m/%d/%Y | US |
| 010206 | MMddyy | %m%d%y | US |
| Jan-02-06 | MMM-dd-yy | %b-%d-%y | US |
| Jan-02-2006 | MMM-dd-yyyy | %b-%d-%Y | US |
| 06 | yy | %y | |
| Mon | EEE | %a | |
| Monday | EEEE | %A | |
| Jan-06 | MMM-yy | %b-%y |
時刻
| Goのフォーマット | Java表記 | C表記 | 備考 |
|---|---|---|---|
| 15:04 | HH:mm | %R | |
| 15:04:05 | HH:mm:ss | %T | ISO 8601 |
| 3:04 PM | K:mm a | %l:%M %p | US |
| 03:04:05 PM | KK:mm:ss a | %r | US |
日時結合
| Goのフォーマット | Java表記 | C表記 | 備考 |
|---|---|---|---|
| 2006-01-02T15:04:05 | yyyy-MM-dd'T'HH:mm:ss | %FT%T | ISO 8601 |
| 2006-01-02T15:04:05-0700 | yyyy-MM-dd'T'HH:mm:ssZ | %FT%T%z | ISO 8601 |
| 2 Jan 2006 15:04:05 | d MMM yyyy HH:mm:ss | %e %b %Y %T | |
| 2 Jan 2006 15:04 | d MMM yyyy HH:mm | %e %b %Y %R | |
| Mon, 2 Jan 2006 15:04:05 MST | EEE, d MMM yyyy HH:mm:ss z | %a, %e %b %Y %T %Z | RFC 1123 RFC 822 |
特殊なケース
以下のような特殊なケースはtimeパッケージでは対応できません。
- 24時間表記で先頭ゼロを省略する表現は不可能です。
24:00ではなく00:00として正子を表すことが必須です。例えば営業時間の07:00-24:00のように表現できません。- リープ秒を含む
23:59:60の時間表現はサポートされていません。実際にはグレゴリオ暦に基づくカレンダーが前提です。