西暦10000年問題

西暦10000年問題(せいれきいちまんねんもんだい、西暦1万年問題)とはコンピュータの誤動作に関する年問題である。同義の呼称として、10000を意味する10Kを用いた Y10Kがある。

概要

2000年問題(Y2K問題)の解決のため、コンピュータは年を4桁であらわすのが一般的になった。しかし、西暦10000年を迎えると年数が5桁になるため、この仕様を維持し続けたままだと多くのプログラムが誤動作するという問題のことを指す。

2000年を目前にした1999年4月1日IETFは西暦10000年問題の解決に関するRFC 2550を公開した[1]。これは毎年のエイプリルフールに恒例のジョークRFCであるが、「コードやプログラムはしばしば彼らの意図した状況を超えてよく使われる」という推論からの帰結であり、また、セキュリティ対策的に重要な「いかなるデータに対しても、意図の範囲を越えるような動作をさせないこと」といった点についての技術的な洞察も含んでいる。

表記法

RFC 2550 では、Y10K問題の解決策として、年の新しい表記法は次のような特徴を持つことが望ましいとしている。

  • 既存の4桁の形式と互換性がある。
  • 10000年以降の日付を容易に識別できる。
  • ASCII順によるソートが可能。
  • 宇宙の寿命の範囲をすべて表現できる。
    • 現在の宇宙の年齢は年から年の間と推定される。
    • 宇宙の死は年から年で起こると推定される。
    • したがって、最低でも未来と過去年を表現可能とする。

上記の特徴を持つ日付表記法は固定長では実現できないため、以下のような可変長の表記法が提案されている。

西暦 1 - 9999 年

現在の4桁表記と互換性を保つため、10進数4桁で表現する。1000年以前の年号は4桁にするために、先頭に0を付ける必要がある。

西暦 10,000 - 99,999 年

5桁の年の先頭に A を付与する。つまり、西暦10,000年は A10000 西暦99,999年は A99999 となる。

ASCII順では A9 の後ろになるため、望むソート結果が得られる。

西暦 100,000 - 10 の 30 乗年

同様に 6 桁の年の先頭に B を、7桁の年の先頭に C を付ける。 ASCIIの大文字26文字で、 年までが表現可能となる(表現できる最後の年は西暦 999,999,999,999,999,999,999,999,999,999 年で、Z999999999999999999999999999999 となる)。

西暦 10 の 30 乗 - 10 の 56 乗年

現在の想定では宇宙の寿命は西暦 年よりも前に終わると予測されているが、Y2K問題の教訓から 年以降についても表現できるようにしている。

数字の年の先頭にキャレット ^ と1文字の英字を付けて表現する。^A1000000000000000000000000000000^Z99999999999999999999999999999999999999999999999999999999のように表現する。

西暦 10 の 56 乗 - 10 の 732 乗年

数字の年の先頭にキャレットを2つと2文字の英字を付ける。つまり A から Z までの26文字で表現する26進数で表現する。

具体的には ^^AA100000000000000000000000000000000000000000000000000000000から^^ZZ999..999(9が732個続く)となる。

西暦 10 の 732 乗年以降

数字の年の先頭にキャレットを3つと3文字の英字(3桁の26進数)を付ける。

これ以降も同様にキャレットと英字(26進数)を増やしていくことで、上限なく表現することが可能となる。

紀元前

紀元前については、紀元後の補数表現で表わす。具体的には、紀元後の年の表現を以下のように変換する。

  • 英字(26進数)は、その補数で置き換える。例えば AZBYCX、……、 ZAに置き換える。
  • 数字は、その補数で置き換える。例えば 091827、……、90に置き換える。
  • キャレット ^ は感嘆符 ! に置き換える。
  • 4桁の年は、先頭にスラッシュ / を追加する。
  • 感嘆符やスラッシュで始まらない年は、先頭にアスタリスク * を追加する。

例えば、紀元前1年は /9998 年となる。

脚注

  1. ^ Y10K and Beyond (英語) 1999年4月1日 2011年11月12日閲覧
    Y10K and Beyond(Y10Kとその先) (日本語) 2001年1月13日 2011年11月12日閲覧