Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

[インデックス 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

注目すべきは、時刻部分の150415: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オブジェクトを文字列に変換します。

今回の変更では、RFC822RFC822Zという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形式が要求される場面での互換性を確保するために重要です。

関連リンク

参考にした情報源リンク