2038年問題[クローズ]


回答:


17

いくつかの長期暗号証明書で2038年を超える日付を処理する必要がある組み込みLinuxシステムでこの問題に遭遇したため、この可能性はアプリケーションドメインに依存すると思います。

ほとんどのシステムは2038年よりも前に準備ができているはずですが、今日の日付を計算するのがずっと先である場合は、問題が発生している可能性があります。


いいね!私はその例を考えていませんでした!PKI標準は、証明書内の時間構文として何を使用しますか?見たことない!
-geoffc

@geoffc、実際には独自の形式であり、内部の日付/時刻構造があり、それ自体は2038年以降の日付に適合するのに十分な大きさでしたが、日付/時刻変換にはGLIBC関数を使用しました。正しく思い出せば、mktime通話は静かに失敗していました。
アレックスB

13

これは重大な問題になると思います。影響を受けるコードは一般に低レベル(CTIME)であるため、1999/2000のY2Kの問題よりもはるかに有害です。

さらに問題を複雑にするのは、Y2Kが湿ったスクイブであると認識されていたという事実により、イベントへの準備段階で問題に注意を向けることが難しくなることです。

文化的な参照:

Cory Doctorowは、オープンライセンスの下で短編コンミッショニング/パブリッシングの新しいモデルを試していましたが、そのうちの1つに2038のテーマを提案しました。彼はEpochで見事にそれを行いました:http : //craphound.com/?p=2337


当時この問題に取り組んでいた誰かとして、Y2Kは多くの作業と事前の計画のために動揺しました。湿ったスクイブの認識は、メディアのすべての誇張された終末論によって強化されました。2035年頃から多くの計画と作業が行われると予想していますが、運が良ければメディアの大失敗を逃します。
デイヴィッドソーンリー

リンクマークに乾杯。
boehj

9

数年前、30年ローンの計算を行っている住宅ローンプログラムなどの分野で、問題がすでに報告されていました:2008 + 30 = 2038。


8

64ビットOSは、最終的には2037問題とは無関係です。(CTIMEは2038年よりも2037年に近くなります)。

問題はOSのビット深度ではなく、OSが時間をどのように保存するかです。または、データベース列はどのように時間を保存することを選択しますか。または、このディレクトリサービスは、バックエンドで時間構文属性の時間をどのように保存しますか。

これは、32ビットのタイムカウンターを使用することが非常に一般的であるため、人々が考えるよりもはるかに大きな問題です。

時間を保存する各インスタンスを再確認し、すべてのAPIを更新し、それを使用するすべてのツールも更新する必要があります。

書き出された生データの代わりに、人間が読める形式で時間を設定できる抽象化レイヤーにより、簡単になりますが、これは1つのケースにすぎません。

これは、ほとんどの人が考えるよりもはるかに大きな取引になると思います。


1
私が見る最大の問題はファイル形式とファイルシステムですが、ext4の日付範囲は2514、vfatは2107です。問題はreiserfs(2038)にあります。
Maciej Piechotka

ReiserFSにはまだ他の問題もあります。私はまだ、人々がCTIMEでその店の時間を考えるより多くの隠された場所があると思います。とても簡単で便利な時間形式です。もちろん、署名されていないCTIMEには2037問題はありません。これは2107タイムスタンプの場合だと思います。
-geoffc

1
Apple HFSを考えています。FATはまったく使用time_tしません。年、月、日を1つの16ビット値のフィールドとして保存します。日は5ビット、月は4ビット、年は7ビットです。2107は1980(FAT土地のゼロ年)+ 2 ^ 7-1です。さらに楽しくするために、FATは別の16ビット値に同じように時刻を格納しますが、計算を行うと、この方法で時刻を格納するには17ビットが必要であることがわかります。FATは、1秒間の解像度を数秒間落とすことでこれを回避します。FATは、2秒未満の変化を区別できません。ああ、マイクロソフト、あなたの不必要な非互換性がなければ、これはなんと退屈な世界でしょう!
ウォーレンヤング

8

これは私の意見ですが、この問題は32ビットカウンターの問題によるものです。今日、ほとんどのOSは64ビット(少なくとも64ビットコンピューター)で時間を処理するように更新されています。つまり、2038年まで
にソフトウェアを実行している場合にのみ問題が発生する可能性があります。ほとんどの場合、問題になるとは限りません。私は願います。


Ubuntu 32ビットバージョンを試してみましたが、2038の問題を示しましたが、Ubuntu 64ビットバージョンを実行しても2038の問題の兆候はありませんでした。他のUnixを試したことはありません。
ジミーヘッドマン

はい、ほとんどの32ビットバージョンでは問題が表示されますが、64ビットバージョンでは表示されません。2038
半径

2
これはばかげた仮定です。私たちは現在でも16(および8ビット)マイクロプロセッサを使用していますが、32ビットマイクロプロセッサは将来的に魔法のように消滅するでしょうか?これは平均的なユーザーに影響を与えないと言うのは公平ですが、エッジの場合は引き続き問題になる可能性があります。
イーライ・フレイ

まあ-16ビットと8ビットのコンピューターは1.日付0(1970-01-01から2010-01-01など)に移動できます-ただし、特定のAPI / ABI規則に違反するでしょう2.タイマーフィールドを拡張します(特定の場合に「唯一の」ABIを壊す可能性があります)。
マチェイピエチョトカ

1

そんなに大したことじゃない。

最初のY2Kブリッツでは、ソフトウェアおよびハードウェアベンダーが製品を販売するために「Y2K準拠」であると認定する必要がありました(PC接続のネットワークケーブルがY2K準拠であると認定されていることを覚えています) 、将来的にクロックを設定してテストします。

当時、テストのコストは非常に高かったため、ほとんどの場合、1/1/99(一部の開発者は99を番人として使用した可能性があります)、12/31 / 99、1 / 1 / 00、2000年の跳躍、1/19/38、およびその他多数。退屈なリストはこちらをご覧ください。

したがって、1999年に存在した重要なソフトウェアにはおそらく2038個のバグはないと思いますが、それ以来、無知なプログラマーによって書かれた新しいソフトウェアにはバグがあると思います。Y2K全体の大失敗プログラマーは一般に、日付エンコードの問題をはるかに意識するようになったため、Y2K(それ自体が反クライマックスのようなもの)ほど大きな影響を与えることはないでしょう。


この問題は、UNIXのtime_t型が32ビットであるために発生することを除きます。
Yuhongバオ14

1

それまでに実行されている32ビットシステムが問題になります。


2
が問題になり、どのように対応するかをより明確にするために、それについて詳しく説明してもらえますか?
アントン

問題は、時間の計算に使用される32ビット整数にあります。時間は、1970年1月1日から経過した秒数で測定されます。たとえば、1日後、このカウンターは86400になります。したがって、2038では、この値は、符号なし32ビット整数。12月4日292277026596(2920億年)日曜午後03時30分08秒まで作業することができますよう、タイムスタンプ用の64ビットを使用して64ビットシステムでは、この問題を持っていません
ラーフルKadukar

0
#include <time.h>
#include <stdio.h>

int main() {
  time_t t = (time_t)(1L << (sizeof(time_t)*8 - 9));
  printf("%d\n", sizeof(time_t));
}

9ではなく1にする必要がありますが、ctimeはより大きな日付を処理しません。

8 - Sun Jun 13 07:26:08 1141709097

私のシステム(もちろん64ビット)の時間は、さらに100万年も実行できます。解決策は、システムを64ビットに更新することです。

キャッチは、プログラムがそれを処理しない可能性があることです。特に古く、財産的で、維持されていません。開発者は次の事実に慣れています:

  • intは32ビットです(実際には、常に32ビットであると想定されているため、64ビットシステムでは32ビットとして保存されます)
  • ほとんどのタイプ(などtime_t)は安全にキャストできますint

一般的なFLOSSソフトウェアでは、おそらく両方が「多目」のレビューを通過しません。あまり人気がなく所有権のあるものでは、著者に大きく依存します。

無料の* nixの世界では、2038は「見過ごされて」しまいますが、「プロプライエタリ」プラットフォーム(つまり、多数のプロプライエタリソフトウェアを使用するプラットフォーム)で問題が発生します。


「システム」や「OS」ではありません。ほとんどの以前の32ビットOS(16ビットOSであっても)は64ビットの演算を実行できました。OSレベルでの64ビットの深さは、基本的にメモリモデルへの参照であり、数学を実行する能力ではありません。そして、時間はすべて数学に関するものです。
-geoffc

はいといいえ。32ビットおよび64ビットOSが64ビット演算を実行できることは事実です(任意の演算をエミュレートできます)。ただしtime_t、32ビットOSでは(または同等の)32ビットが発生しtime_t、64ビットOSでは(または同等の)64ビットが発生します。ある程度単純化しても、十分に明確だと思いました。
マチェイピエチョトカ

0

Y2Kのようなものである場合、一部の人々はすでに影響を受けてソフトウェアを変更していますが、ほとんどの開発者は2030年代、おそらく2035年頃までそれを無視します。 K&R Cを知り、まだ老いすぎていないことを知ると、突然多額のお金で契約できます。実際の移行では、まだ行われていない多くのこと、おそらくそれほど重要ではないことの多くが表示されます。


-5

Y2Kの問題は、4年ではなく、年を表す2つの憲章でした。

多くのシステムは2000を1900と区別する方法がありませんでした。なぜなら、それらは '00'のみを保存したからです。

ほとんどすべてのシステムは、現在、年を格納するために4文字を使用するか、何らかのライブラリを使用します。

そのため、すべての人が10000年(Y10K)を心配することになります。OSおよびライブラリライターを除く...


おそらく誰も(実際には誰も)日付を保存しているのはおそらくそのような形式(つまりDCDまたは文字列)です。通常、時間はオブジェクトまたはintによって処理されます(したがって、表示コードのみを更新する必要があります)。
マチェイピエチョトカ

はい、正確に私のポイント。Y2Kは、日付を固定長文字列として表すというアイデアを事実上無効にしました。
スティーブンヤズジェウスキ

@Stephen:COBOLの世界ではありませんが、幸いにもUni​​x / LinuxでのCOBOL実装はほとんどありません。
デビッド

@David:ほとんどの場合、COBOLプログラムはY2Kの問題でした。ユーザーの観点から見ると、Linux / UnixシステムにはY2Kの問題がありましたか?元の質問に対する簡単な答えはノーです。
スティーブンヤズジェウスキ

4
ポスターはy2kの問題について尋ねていません。彼らはy2k38の問題について尋ねていますが、これはまったく別の獣です。説明については、en.wikipedia.org / wiki / Y2K38を確認してください。
ケビンM
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.