Go言語での日時変換

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の時間表現はサポートされていません。実際にはグレゴリオ暦に基づくカレンダーが前提です。

タグ: Go言語 日時処理 フォーマット

7月10日 22:39 投稿