zishu's blog

zishu's blog

一个热爱生活的博主。https://zishu.me

なぜgetTime()は1970年から現在までのミリ秒を返すのですか?

今日、new Date () を書いているときに、非常に興味深いメソッドgetTime()を偶然見つけました。百度で調べたところ、1970 年 1 月 1 日から現在までのミリ秒数を計算するものだと言われています。

なぜ 1970 年なのか?

new Date().getTime();

// xxxxxxxxxxx

これは Unix の誕生に由来しています。Unix は 1969 年に開発され、1971 年に正式にリリースされました。それ以前には、1970 年 1 月 1 日 00:00:00 以前の時間を表す必要がある機械はありませんでした。その後、多くのプログラミング言語がこの習慣を引き継ぎ、js もこの習慣を踏襲しただけです。

もちろん、このやり方は今見ると問題があります。例えば、より早い時間を表すのが不便で、精度も限られています。

1970 年 1 月 1 日から時間を定義することを考えると、JAVA では Oracle データベースの時間も 1970 年 1 月 1 日から計算されることを思い出しました。

例えば、java のクラスコード:

Date date = new Date(0);

System.out.println(date);

// 出力される結果:Thu Jan 01 08:00:00 CST 1970

これは 1970 年 1 月 1 日で、実際の時分秒は 0 時 0 分 0 秒です(ここでは 8 時と表示されていますが、後で説明します)。

なぜこの時間が 1970 年 1 月 1 日と定義されているのでしょうか?

そこで Google を始めましたが、中国語のウェブページでは全く答えが見つかりませんでした。英語のキーワードで検索してみると、Sun java フォーラムでようやく正確なスレッドを見つけました:

http://forums.sun.com/thread.jspa?threadID=595140&start=15

その中にある返信の一つ:

I suspect that Java was born and raised on a UNIX system.
UNIX considers the epoch (when did time begin) to be midnight, January 1, 1970.
これは、java が UNIX システムに起源を持ち、UNIX が 1970 年 1 月 1 日 0 時を時間の紀元と見なしていると言っています。

しかし、これでも「なぜ」の説明にはなりません。好奇心から、さらに Google を続け、ようやく答えを見つけました:

http://en.wikipedia.org/wiki/Unix_time

ここでの説明は:

最初のコンピュータオペレーティングシステムは 32 ビットであり、時間も 32 ビットで表されていました。

System.out.println(Integer.MAX_VALUE);

2147483647

Integer は JAVA 内で 32 ビットで表されるため、32 ビットで表せる最大値は 2147483647 です。また、1 年 365 日の総秒数は 31536000 であり、2147483647/31536000 = 68.1、つまり 32 ビットで表せる最長の時間は 68 年です。実際には 2038 年 01 月 19 日 03 時 14 分 07 秒に最大時間に達し、この時間を超えるとすべての 32 ビットオペレーティングシステムの時間は 10000000 00000000 00000000 00000000 となり、1901 年 12 月 13 日 20 時 45 分 52 秒に戻ってしまいます。これにより、時間が逆戻りする現象が発生し、多くのソフトウェアが異常動作をすることになります。

ここまで来ると、問題の答えが出てきたと思います:

32 ビットで時間の最大間隔が 68 年であるため、最初に登場した UNIX オペレーティングシステムは、コンピュータが誕生した年代と応用の期限を考慮して 1970 年 1 月 1 日を UNIX TIME の紀元時間(開始時間)として選び、java もこの制約に従ったのです。

時間の逆戻りの現象は、64 ビットオペレーティングシステムの登場により徐々に解決されると信じています。64 ビットオペレーティングシステムでは 292,277,026,596 年 12 月 4 日 15 時 30 分 08 秒まで表現できるため、私たちの子孫は、たとえ地球が滅びる日でも心配する必要はありません。この時間はすでに千億年後のものだからです。

最後の質問:

上記の System.out.println (new Date (0)) で出力される時間が 0 時ではなく 8 時である理由は、システム時間とローカル時間の問題があるためです。実際にはシステム時間は依然として 0 時ですが、私のコンピュータのタイムゾーンが東 8 区に設定されているため、出力結果は 8 時になります。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。