1600年代の日付が可能なのはなぜですか?
Windowsは、Unixシステムのようなファイル変更タイムスタンプを保存しません。Windows Dev Center(エンファシス鉱山)によると:
ファイル時間は、1601年1月1日午前12:00から協定世界時(UTC)を経過した 100ナノ秒間隔の数を表す64ビット値です。システムは、アプリケーションがファイルを作成、アクセス、および書き込みするときのファイル時間を記録します。
したがって、ここで間違った値を設定することにより、1600年代から簡単に日付を取得できます。
もちろん、もう1つの重要な質問は、この値がどのように設定されたかです。実際の日付は何ですか?ファイルシステムドライバーの計算エラーである可能性があるため、見つけることができないと思います。別の答えは、日付は実際にはWindowsタイムスタンプとして解釈されるUnixタイムスタンプであるが、実際には異なる間隔(秒対ナノ秒)で計算されるという仮説です。
これは2038年問題にどのように関係しますか?
Unixは最初に32ビット整数を使用していたため、Windowsは(一般的に)従来のUNIXシステムが抱えていた2038年問題の影響を受けません。これは、Windowsが64ビット整数持っています。(これは、Unixが数秒で動作し、Windowsがマイクロ/ナノ秒で動作しているにもかかわらずです。)
もちろん、古いバージョンのVisual Studioでコンパイルされた32ビットプログラムを使用している場合、Windows は依然として影響を受けます。
新しいUnixオペレーティングシステムでは、既にデータ型が64ビットに拡張されているため、この問題は回避されています。(実際、Unixタイムスタンプは数秒で動作するため、新しいラップアラウンドの日付は今から292億年です。)
設定できる最大の日付は何ですか?
好奇心ones盛な人のために–これを計算する方法は次のとおりです。
- 64ビット整数で可能な値の数は2 63 – 1 = 9223372036854775807です。
- 各ティックは100ナノ秒を表します。これは0.1 µsまたは0.0000001 sです。
- 最大時間範囲は9223372036854775807⨉0.0000001秒なので、数千億秒になります。
- 1時間には3600秒、1日には86400秒、1年には365日があるため、1年には86400×365秒= 31536000秒があります。これはもちろん、average年、うるう秒、または将来の黙示録的な政権が残りの地球人に命令するかもしれないカレンダーの変更を無視して、平均に過ぎません。
- 9223372036854775807⨉0.0000001秒/ 31536000秒≈29247年
@corsiKa
うるう年を減算する方法を説明します:29247/365/4≈20
- したがって、最大年は1601 + 29247 – 20 = 30828です。
一部の人々は実際にこれを設定しようとし、同じ年を思いついた。