今日、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 時になります。