あなたの時計は大丈夫? 「想定外」だった日時の不具合(原本)
- 5. 西暦2000年問題中途半端な対応
下2桁で処理するまま残そうとしたが…
• 西暦2030年問題 • 西暦2069年問題
– 00~29なら2000年代 – 00~68なら2000年代
– 30~99なら1900年代 – 69~99なら1900年代
• 西暦2050年問題 • 西暦2070年問題
– 00~49なら2000年代 – 00~69なら2000年代
– 50~99なら1900年代 – 70~99なら1900年代
• 西暦2100年問題
– 00~99なら2000年代
- 7. 西暦2010年問題
•年を西暦下2桁で処理 • 発生した事例
•2進化10進表現として格納 – シチズンの電波時計「ワ
ールタイムドシリーズ」
•「10」を0x10=16と誤認! (2008年に発覚)
2009 ⇒ 09
– オーストラリアクイーンズ
2010 ⇒ 16 ランド銀行の金融システ
2011 ⇒ 17 実際より ム(2010年)
… 6年後と – ドイツジェムアルト社のIC
2018 ⇒ 24 誤認 カード使用不能
2019 ⇒ 25 – PlayStation3で2010年を閏
2020 ⇒ 32 実際より 年と誤判定(3月1日に2月
29日と表示して発覚)
… 12年後と
2029 ⇒ 41 誤認
- 8. 元号の処理方法による問題
• 昭和100年問題
– 年を昭和2桁で表現
• 平成以降も、内部的には昭和として扱う
– 「平成23年」は「昭和86年」
• 官公庁や金融機関などに存在
– 「昭和100年(2025年(平成37年))=昭和0年」と誤認
• 平成100年問題
– 年を平成2桁で表現
– 「平成100年(2088年)=平成0年」と誤認
- 9. もう一つの西暦2000年問題(閏年)
• 閏年と算出できない
1. 4で割り切れる年は閏年
2000は4で割り切れる
2. 4でも100でも割り切れる年は閏年ではない
2000は4でも100でも割り切れる
3. 4でも100でも400でも割り切れる年は閏年
2000は4でも100でも400でも割り切れる
– 条件3を忘れ、西暦2000年を閏年と判定できない
- 11. 西暦2036年問題(NTP)
• 西暦2036年2月6日6時28分15秒(UTC)過ぎに
NTPが誤作動
– 西暦1990年1月1日0時0分0秒(UTC)からの経過秒
数で時間を表現
– 32ビット符号なしの整数で実装
– 西暦2036年2月7日6時28分15秒(UTC)
= 西暦1990年1月1日0時(UTC)
•2^32 まで進むと0と認識
– 2^32 = 100000000000000000000000000000000
– 2^32 – 1 = 11111111111111111111111111111111
32ビット
- 12. 西暦2038年問題(C言語のtime_t型)
• 西暦2038年1月19日3時14分7秒(UTC)過ぎにC言語のtime_t型
を使ったプログラムが誤作動
– 西暦1970年1月1日0時0分0秒(UTC)からの経過秒数で時間
を表現
– 32ビット符号つきの整数で実装した場合に問題発生
– 西暦2038年1月19日3時14分7秒(UTC)
⇒西暦1901年12月13日20時45分7(UTC)
•2^31 – 1 = 2147483647 の次を -2^31 = -2147483648 と認識
0 1111111111111111111111111111111 = 2^31 - 1
1 0000000000000000000000000000000 = -2^31
1 1111111111111111111111111111111 = -1
先頭のビットが1の時はマイナスの数になる
- 13. 西暦2038年問題の亜種
• 西暦2004年1月10日13時37分4秒(UTC)過ぎに誤作動
– 西暦1970年1月1日0時0分0秒(UTC)から2^30秒後
– 時間を2倍する処理が入っていた
• 不具合が起きると判明した or 起きたシステム
– IIJのルータ「SEIL/neu」シリーズ一部機種
• NTPサーバから時刻を取得する設定にすると誤作動
• ファームウェアの修正で事前に対処
– 日本IBM製ATM
• 日本IBM製ソフト「FINEACE/6000」関連の不具合
– KDDI課金システム
• 国内電話サービスの料金を誤請求
- 14. 積算日時による問題一覧(一部)
問題箇所 誤作動の概要 原因
NTP 西暦2036年2月7日6時28分16秒⇒ 西暦1990年1月1日からの
西暦1900年1月1日0時0分0秒 秒数が32ビット整数
C言語の 西暦2038年1月19日3時14分8秒⇒ 西暦1970年1月1日
西暦1901年12月13日20時45分52秒 からの秒数が32ビット符号
time_t型 付き整数
GPS 西暦1999年8月21日の週は 西暦1980年1月6日からの
1980年1月6日と同じ週 週が10ビットの整数
System zの 西暦2042年9月17日23時53分46秒⇒ 西暦1990年1月1日からの
STCK命令で取 西暦1900年1月1日0時0分0秒 μ秒数が限界を超える
得する64ビット
のTODクロック
MacOS 6.X 西暦2019年12月31日⇒ 西暦1920年1月1日
西暦1920年1月1日 からの年数が2桁の整数
Macintosh 西暦2040年2月6日18時28分16秒⇒ 西暦1904年1月1日からの
西暦1904年1月1日0時0分0秒 秒数が32ビット符号付き整
128K 数
- 15. ファイルのタイムスタンプの制限
ファイルシステム 日付の範囲
ext2、ext3、 西暦1901年12月14日~2038年1月18日
ReiserFS
HFS、HFS+ 西暦1904年1月1日~2040年2月6日
FAT 西暦1980年1月1日~2107年12月31日
ext4 西暦1901年12月14日~2514年4月25日
NTFS 西暦1601年1月1日~60056年5月28日