「2038年問題」の版間の差分
削除された内容 追加された内容
タグ: モバイル編集 モバイルウェブ編集 |
→類似する年問題: 感想的文言の除去 |
||
(37人の利用者による、間の48版が非表示) | |||
1行目:
{{出典の明記|date=2015年7月}}
'''2038年問題'''(にせんさんじゅうはちねんもんだい)は、[[2038年]][[1月19日]]3時14分7秒([[協定世界時|UTC]]、以下同様)を過ぎると、[[コンピュータ]]が誤
== 経緯 ==
[[ファイル:Year 2038 problem.gif|right|
コンピュータおよび[[プログラム (コンピュータ)|コンピュータプログラム]]における[[時刻]]の表現として「[[UNIX時間]]」《[[協定世界時]]における1970年1月1日0時0分0秒からの経過秒数
伝統的な実装では<code>time_t</code>を<code>int</code>または<code>long</code>の[[typedef]]による型エイリアス(別名)とし、その
ある実装における
この期日以前でも
2000年問題はアプリケーションレベルでの修正が可能であったが、この問題は現在普及しているC言語[[処理系]]やOSのAPIといったシステムの深い層に潜む問題であるため、[[2000年問題]]より深刻であるという指摘もある<ref name="change-makers.jp/technology/11351">{{Cite web|和書|title=2025年問題の次は2038年問題!コンピュータの暦問題を探る(後編)|author=CHANGE-MAKERS|url=https://www.change-makers.jp/technology/11351|access-date=2018-11-20}}</ref>。
== 対策 ==
対策としては、<code>time_t</code>型を符号
[[macOS]]
32ビット版の[[Microsoft Windows]] (Win32) では内部時刻の表現に64ビット化された<code>FILETIME</code>構造体<ref>[https://docs.microsoft.com/en-us/windows/win32/api/minwinbase/ns-minwinbase-filetime FILETIME (minwinbase.h) - Win32 apps | Microsoft Docs]</ref>を使っており、<code>time_t</code>を使っているわけではない。そのため、Windows OS側に関しては、旧OSに関する一部のケースを除き<ref>[https://web.archive.org/web/20060626085939/http://support.microsoft.com/kb/436249/JA/ システム日付が 2038 年以降に設定されていると、Windows XP のセットアップが途中で停止する場合がある], [[Internet Archive]]</ref><!-- Windows XP SP3 では解消されているのかもしれないが、未確認。 -->、32ビット版であっても2038年問題は発生しない<ref>[https://docs.microsoft.com/en-us/archive/blogs/mthree/another-look-at-the-year-2038-problem Another look at the year 2038 problem | Microsoft Docs]</ref>。ただし、Microsoft C/C++ (MS-C) および古いバージョンの[[Microsoft Visual C++]] (MSVC) においては、<code>time_t</code>は32ビットの<code>long int</code>を使って定義されていたため、これらの古い処理系のC/C++ランタイムライブラリ (CRT) を利用して構築された[[アプリケーションソフトウェア]]や[[DLL]]などは、2038年問題を抱えていることになる。[[x64]]アーキテクチャの64ビット版Windows OS上では[[WOW64]]サブシステムにより[[x86]]アーキテクチャ向けに構築された32ビットアプリケーションも動作させることができるが、古い32ビットアプリケーションにおける2038年問題は、たとえWindows OSを64ビット版に入れ替えたとしても回避することはできない。[[Microsoft Visual C++]] 2005以降では、既定で<code>time_t</code>は<code>__time64_t</code>と等しく<ref>[https://docs.microsoft.com/en-us/cpp/c-runtime-library/time-management Time Management | Microsoft Docs]</ref>、32ビットアプリケーションであっても<code>time_t</code>は64ビット化されるため、古いアプリケーションを新しい処理系およびランタイムで構築し直せば2038年問題を回避できる。
== 関連した問題 ==
*時刻aと時刻bのちょうど中間の時刻を求め
*# '''時刻の差を計算する''': まず、時刻bから時刻aを引いて、その差を求める。
*[[2001年9月9日問題]]は、2001年9月9日にtime_t型の値が999,999,999秒から1,000,000,000秒と桁が増えることに伴う問題。time_t型の値を文字列(辞書順)でソートしていたことで、「999,999,999 > 1,000,000,000」と判断され、項目の新旧が正しく判断されない問題(新しく作られた項目が表示されない、古いものとみなされ削除されるなど)が発生した。▼
*# '''差の半分を求める''': 求めた差を2で割る。
*[[Network Time Protocol|NTP]]など、1900年1月1日からの積算秒数で時間を表現するシステムもあり、符号なし32ビットの値が[[2036年]][[2月7日]]6時28分15秒 (UTC) を超えるとオーバーフローすることによって問題が発生する(→[[Network Time Protocol#2036年問題|2036年問題]])。[[Simple Network Time Protocol|SNTPv4]]を定めたRFC 4330には、最上位ビットが0の場合は時刻が2036年から2104年の間であるとみなして、2036年2月7日6時28分16秒 (UTC) を起点として計算することで2036年問題を回避する方法が書かれている。▼
*# '''時刻aに加える''': 最後に、時刻aに差の半分を加えることで、中間の時刻を求める。 この方法を数式で表すと、次のようになる: 中間時刻=''Ta''+(''Tb''−''Ta'')/2
== 類似する年問題 ==
▲*[[2001年9月9日問題]]は、2001年9月9日にtime_t型の値が
▲*[[Network Time Protocol|NTP]]など、1900年1月1日からの積算秒数で時間を表現するシステムもあり、符号なし32ビットの値が[[2036年]][[2月7日]]6時28分15秒 (UTC) を超えるとオーバーフローすることによって問題が発生する(→[[Network Time Protocol#2036年問題|2036年問題]])。[[Simple Network Time Protocol|SNTPv4]]を定めた
*2038年4月23日問題 - [[ユリウス通日]]を内部日付表現に用いる物のうち、基準日([[グレゴリオ暦]]1858年11月17日正午)からの修正ユリウス日(MJD)を使用し、かつ16ビットで処理しているシステムでは、日数が16ビットからあふれるために問題が起こる。
* 2038年11月21日問題 - [[グローバル・ポジショニング・システム|GPS]]は内部処理で週数を10ビットで管理しており、起点である1980年1月6日から3072週後にあふれて0に戻る。(10ビットでは3回目)
* 2040年問題 - UNIX系システムで使用されるtime_t型の値が、2040年1月1日にオーバーフローする可能性がある。これは、32ビットの符号付き整数で表現されるtime_t型が、1970年1月1日からの秒数をカウントしているためである。この問題を回避するためには、64ビットのtime_t型に移行する必要がある。
* 2050年問題 - 一部のシステムでは、2050年を超えると日付の計算に問題が生じる可能性がある。これは、システムが2桁の年数を使用しているためであり、2050年以降の日付を正しく認識できないことが原因である。
* 2100年問題 - グレゴリオ暦の閏年計算に関連する問題である。通常、4で割り切れる年は閏年であるが、100で割り切れる年は閏年ではない。ただし、400で割り切れる年は再び閏年となる。2100年は100で割り切れるが、400では割り切れないため、閏年ではない。このため、一部のシステムでは2100年を閏年と誤認識する可能性がある。この問題を回避するためには、システムの閏年計算ロジックを修正する必要がある。
== 脚注 ==
{{脚注ヘルプ}}
=== 注釈 ===
{{Notelist}}
=== 出典 ===
{{Reflist}}
== 関連項目 ==
42 ⟶ 55行目:
== 外部リンク ==
*[http://sunpillar.jf.land.to/bekkan/javascript/2038.shtml#TIMER 2038年問題へのカウントダウン]{{Ja icon}}
{{年問題}}
{{DEFAULTSORT:2038ねんもんたい}}▼
▲{{DEFAULTSORT:2038ねんもんたい}}
[[Category:
[[Category:UNIX]]
[[Category:コンピュータ史]]
[[Category:
[[Category:
|