3. Two Digit Years (2桁の年)
以下の要件は、2桁の年が引き起こす曖昧性の問題に対処します:
要件
o 4桁の年は必須
インターネットプロトコルは、日付において4桁の年を生成しなければなりません (MUST)。
正しい例:
✅ 2002-07-15
✅ 1999-12-31
誤った例:
❌ 02-07-15
❌ 99-12-31
o 2桁の年は非推奨
2桁の年の使用は非推奨 (Deprecated) です。2桁の年を受信した場合、誤解釈がプロトコルまたは処理の失敗を引き起こさない場合(例えば、ログ記録または追跡目的のみに使用される場合)にのみ受け入れるべきです (SHOULD)。
o 3桁の年の処理
2桁の年を使用するプログラムは、1999年以降の年を3桁として表す可能性があります。これは、プログラムが桁数をチェックせずに単純に年から1900を減算する場合に発生します。このような欠陥のあるソフトウェアによって生成された日付を堅牢に処理したいプログラムは、3桁の年に1900を加算してもよい (MAY) です。
例:
欠陥のあるプログラム出力: 102 (2002年を表す)
堅牢な解析: 102 + 1900 = 2002
o 非数字の10年桁の処理
2桁の年を使用するプログラムは、1999年以降の年を ":0"、":1"、... ":9"、";0"、... として表す可能性があります。これは、プログラムが単純に年から1900を減算し、10年桁をUS-ASCII文字ゼロに加算する場合に発生します。このような欠陥のあるソフトウェアによって生成された日付を堅牢に処理したいプログラムは、非数字の10年桁を検出し、適切に解釈すべきです (SHOULD)。
例:
欠陥のあるプログラム出力:
- '0' + 10 = ':' (2000年代を表す、ASCIIコード58)
- '0' + 11 = ';' (2010年代を表す、ASCIIコード59)
堅牢な解析はこれらのパターンを認識し、正しく変換する必要があります
Y2K問題からの教訓
2桁の年の問題は、インターネットプロトコルで使用されるすべての日付と時刻が完全修飾 (Fully Qualified) されなければならない (MUST) 理由を十分に示しています。
実装の推奨事項
日付を生成する場合
✅ 常に4桁の年を使用: 2024-12-21
❌ 決して2桁を使用しない: 24-12-21
日付を解析する場合
# 堅牢な解析の例
def parse_year(year_str):
if len(year_str) == 4:
return int(year_str) # 正しい4桁
elif len(year_str) == 2:
# 非推奨、後方互換性のみ
year = int(year_str)
if year < 70:
return 2000 + year
else:
return 1900 + year
elif len(year_str) == 3:
# 欠陥のあるソフトウェアの処理
return 1900 + int(year_str)
else:
raise ValueError("Invalid year format")
警告: このセクションでは2桁の年の処理方法を説明していますが、これは後方互換性のためだけのものです。新しい実装は絶対に2桁の年を生成してはなりません (MUST NOT)。