西暦10000年問題(せいれきいちまんねんもんだい、西暦1万年問題)とはコンピュータの誤動作に関する年問題である。同義の呼称として、10000を意味する10Kを用いた Y10Kがある。
2000年問題(Y2K問題)の解決のため、コンピュータは年を4桁であらわすのが一般的になった。しかし、西暦10000年を迎えると年数が5桁になるため、この仕様を維持し続けたままだと多くのプログラムが誤動作するという問題のことを指す。
2000年を目前にした1999年4月1日、IETFは西暦10000年問題の解決に関するRFC 2550を公開した[1]。これは毎年のエイプリルフールに恒例のジョークRFCであるが、「コードやプログラムはしばしば彼らの意図した状況を超えてよく使われる」という推論からの帰結であり、また、セキュリティ対策的に重要な「いかなるデータに対しても、意図の範囲を越えるような動作をさせないこと」といった点についての技術的な洞察も含んでいる。
RFC 2550 では、Y10K問題の解決策として、年の新しい表記法は次のような特徴を持つことが望ましいとしている。
上記の特徴を持つ日付表記法は固定長では実現できないため、以下のような可変長の表記法が提案されている。
現在の4桁表記と互換性を保つため、10進数4桁で表現する。1000年以前の年号は4桁にするために、先頭に0を付ける必要がある。
5桁の年の先頭に A
を付与する。つまり、西暦10,000年は A10000
西暦99,999年は A99999
となる。
ASCII順では A
は 9
の後ろになるため、望むソート結果が得られる。
同様に 6 桁の年の先頭に B
を、7桁の年の先頭に C
を付ける。
ASCIIの大文字26文字で、 年までが表現可能となる(表現できる最後の年は西暦 999,999,999,999,999,999,999,999,999,999 年で、Z999999999999999999999999999999
となる)。
現在の想定では宇宙の寿命は西暦 年よりも前に終わると予測されているが、Y2K問題の教訓から 年以降についても表現できるようにしている。
数字の年の先頭にキャレット ^
と1文字の英字を付けて表現する。^A1000000000000000000000000000000
や^Z99999999999999999999999999999999999999999999999999999999
のように表現する。
数字の年の先頭にキャレットを2つと2文字の英字を付ける。つまり A
から Z
までの26文字で表現する26進数で表現する。
具体的には ^^AA100000000000000000000000000000000000000000000000000000000
から^^ZZ999..999
(9が732個続く)となる。
数字の年の先頭にキャレットを3つと3文字の英字(3桁の26進数)を付ける。
これ以降も同様にキャレットと英字(26進数)を増やしていくことで、上限なく表現することが可能となる。
紀元前については、紀元後の補数表現で表わす。具体的には、紀元後の年の表現を以下のように変換する。
A
は Z
、B
は Y
、C
は X
、……、 Z
は A
に置き換える。0
は 9
、1
は 8
、2
は 7
、……、9
は 0
に置き換える。^
は感嘆符 !
に置き換える。/
を追加する。*
を追加する。例えば、紀元前1年は /9998
年となる。