[インデックス 12826] ファイルの概要
このコミットは、Go言語の標準ライブラリtime
パッケージにおけるRFC822
およびRFC822Z
定数の定義を修正し、RFC 822標準に準拠させるものです。具体的には、時刻部分のフォーマットに欠けていたコロンを追加しています。
コミット
- コミットハッシュ:
7a33265ccdf37b7f15125f7e561e4da3a0e0ad9d
- Author: Rob Pike r@golang.org
- Date: Wed Apr 4 06:54:39 2012 +1000
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/7a33265ccdf37b7f15125f7e561e4da3a0e0ad9d
元コミット内容
time.RFC822: make the string standard-compliant
For mysterious reasons, the existing string was just wrong: it was missing a colon.
There is no apparent reason for this discrepancy.
This should be safe to fix because existing uses would not be RFC822-compliant;
people cannot be depending on it to generate correct mail headers.
Fixes #3444.
R=golang-dev, dsymonds, iant, rsc
CC=golang-dev
https://golang.org/cl/5969072
変更の背景
Go言語のtime
パッケージには、日付と時刻のフォーマットを定義する様々な定数が含まれています。その中の一つであるRFC822
は、RFC 822で定義されている標準的な日付時刻フォーマットを表すためのものでした。しかし、この定数の定義がRFC 822の仕様に厳密には準拠しておらず、時刻部分の分を表す部分の前にコロンが欠落していました。
コミットメッセージによると、この不正確な定義の理由は不明であり、既存の利用方法がRFC 822に準拠していなかったため、この修正は安全であると判断されました。つまり、この定数を使って正しいメールヘッダーなどを生成しているユーザーはいないだろうという前提がありました。この修正は、Go言語の標準ライブラリがより正確で標準に準拠した動作を提供することを目的としています。
前提知識の解説
RFC 822 (Standard for ARPA Internet Text Messages)
RFC 822は、インターネットのテキストメッセージ(特に電子メール)の標準フォーマットを定義したものです。このRFCは、メッセージのヘッダーフィールドの構文、特に日付と時刻の表現方法について規定しています。
RFC 822における日付と時刻のフォーマットは、以下のような形式が一般的です。
Wed, 02 Oct 2002 08:00:00 EST
Wed, 02 Oct 2002 13:00:00 GMT
Wed, 02 Oct 2002 15:00:00 +0200
このフォーマットの主要な構成要素は以下の通りです。
- 曜日: 3文字の略語(例:
Wed,
) - 日付: 1桁の場合は先頭にゼロを付加(例:
02
) - 月: 3文字の略語(例:
Oct
) - 年: 4桁の年(例:
2002
) - 時刻: 24時間形式で、時、分、秒をコロンで区切る(例:
08:00:00
)。ここが今回の修正のポイントです。 - タイムゾーン: 3文字のタイムゾーンコード(例:
EST
,GMT
)またはタイムゾーンオフセット(例:+0200
)
Go言語のtime
パッケージでは、これらのフォーマットをGo独自の参照時刻(Mon Jan 2 15:04:05 MST 2006
)を用いて表現します。この参照時刻の各要素が、フォーマット文字列内の対応する部分に置き換えられることで、様々な日付時刻フォーマットが定義されます。
技術的詳細
このコミットは、Go言語のsrc/pkg/time/format.go
ファイル内のRFC822
およびRFC822Z
定数の文字列定義を変更しています。
変更前:
RFC822 = "02 Jan 06 1504 MST"
RFC822Z = "02 Jan 06 1504 -0700" // RFC822 with numeric zone
変更後:
RFC822 = "02 Jan 06 15:04 MST"
RFC822Z = "02 Jan 06 15:04 -0700" // RFC822 with numeric zone
注目すべきは、時刻部分の1504
が15:04
に変更されている点です。Goのtime
パッケージのフォーマット文字列において、15
は「時(24時間形式)」、04
は「分」を表します。RFC 822の仕様では、時と分の間にはコロン(:
)が必要です。この修正により、RFC822
およびRFC822Z
定数によって生成される時刻文字列が、RFC 822の標準に準拠するようになりました。
また、src/pkg/time/time_test.go
内の関連するテストケースも、新しい正しいフォーマットに合わせて更新されています。これにより、修正が正しく機能し、将来的に回帰が発生しないことが保証されます。
コアとなるコードの変更箇所
diff --git a/src/pkg/time/format.go b/src/pkg/time/format.go
index ad52bab216..98d4bb5c65 100644
--- a/src/pkg/time/format.go
+++ b/src/pkg/time/format.go
@@ -41,8 +41,8 @@ const (
ANSIC = "Mon Jan _2 15:04:05 2006"
UnixDate = "Mon Jan _2 15:04:05 MST 2006"
RubyDate = "Mon Jan 02 15:04:05 -0700 2006"
- RFC822 = "02 Jan 06 1504 MST"
- RFC822Z = "02 Jan 06 1504 -0700" // RFC822 with numeric zone
+ RFC822 = "02 Jan 06 15:04 MST"
+ RFC822Z = "02 Jan 06 15:04 -0700" // RFC822 with numeric zone
RFC850 = "Monday, 02-Jan-06 15:04:05 MST"
RFC1123 = "Mon, 02 Jan 2006 15:04:05 MST"
RFC1123Z = "Mon, 02 Jan 2006 15:04:05 -0700" // RFC1123 with numeric zone
diff --git a/src/pkg/time/time_test.go b/src/pkg/time/time_test.go
index 3430526b8b..fdff0ec36c 100644
--- a/src/pkg/time/time_test.go
+++ b/src/pkg/time/time_test.go
@@ -223,7 +223,7 @@ var formatTests = []FormatTest{
{"ANSIC", ANSIC, "Wed Feb 4 21:00:57 2009"},
{"UnixDate", UnixDate, "Wed Feb 4 21:00:57 PST 2009"},
{"RubyDate", RubyDate, "Wed Feb 04 21:00:57 -0800 2009"},
- {"RFC822", RFC822, "04 Feb 09 2100 PST"},
+ {"RFC822", RFC822, "04 Feb 09 21:00 PST"},
{"RFC850", RFC850, "Wednesday, 04-Feb-09 21:00:57 PST"},
{"RFC1123", RFC1123, "Wed, 04 Feb 2009 15:04:05 PST"},
{"RFC1123Z", RFC1123Z, "Wed, 04 Feb 2009 15:04:05 -0800"},
コアとなるコードの解説
src/pkg/time/format.go
ファイルでは、Go言語のtime
パッケージが日付と時刻をフォーマットするために使用する様々なレイアウト文字列が定数として定義されています。これらの定数は、time.Format()
メソッドに渡されることで、指定されたレイアウトに従ってtime.Time
オブジェクトを文字列に変換します。
今回の変更では、RFC822
とRFC822Z
という2つの定数が修正されました。
RFC822
: RFC 822形式の時刻を表すためのレイアウト文字列です。元の定義では時刻部分が1504
となっており、これは「時」と「分」がコロンなしで連結された形式でした。RFC 822の仕様では時と分の間にコロンが必要なため、15:04
に修正されました。RFC822Z
:RFC822
に数値形式のタイムゾーン情報(例:-0700
)を追加した形式です。こちらも同様に、時刻部分が15:04
に修正されました。
src/pkg/time/time_test.go
ファイルは、time
パッケージの機能が正しく動作することを検証するためのテストコードを含んでいます。formatTests
という変数には、様々なフォーマット定数と、それらを使ってフォーマットされた場合に期待される出力文字列のペアが定義されています。
今回の修正に伴い、RFC822
のテストケースにおける期待される出力文字列も、"04 Feb 09 2100 PST"
から"04 Feb 09 21:00 PST"
へと変更されました。これにより、コードの変更がテストによって検証され、RFC 822標準への準拠が確認されます。
この修正は、Go言語の標準ライブラリが提供する日付時刻フォーマット機能の正確性と信頼性を向上させるものであり、特に電子メールヘッダーなど、RFC 822形式が要求される場面での互換性を確保するために重要です。
関連リンク
- GitHubコミットページ: https://github.com/golang/go/commit/7a33265ccdf37b7f15125f7e561e4da3a0e0ad9d
- Go CL (Change List): https://golang.org/cl/5969072
- Go Issue #3444: https://github.com/golang/go/issues/3444
参考にした情報源リンク
- RFC 822 - Standard for ARPA Internet Text Messages: https://www.rfc-editor.org/rfc/rfc822
- RFC 822 Date Format: https://www.w3.org/Protocols/rfc822/
- Go time package documentation: https://pkg.go.dev/time (現在のドキュメントは修正後の内容を反映しています)