数年前、うちのファイルサーバーでこのファイルを偶然見つけたんだ。
Microsoft Windowsのファイルのプロパティダイアログのスクリーンショット1。
そして、私は、どうしてファイルが1641年に作成されたと言うことができるのか不思議に思っています。私の知る限り、PC上の時刻は1970年1月1日からの秒数で定義されています。もし、このインデックスが不具合を起こしたら、1969年12月31日(インデックスはおそらく-1)を得ることができますが、この一見ランダムに見える日付は、アメリカ合衆国の建国よりも古いもので、私は困っています。
では、どうして1641年の日付のファイルがあるのでしょうか?
PS: 日付はフランス語で書かれています。Février は2月です。
Windowsは[Unixシステムのように]ファイルの修正タイムスタンプを保存しません1。Windows Dev Center]2によると(強調)。
ファイル時刻は、協定世界時(UTC)1601年1月1日午前12時から経過した100ナノ秒の間隔を表す64ビット値である。システムは、アプリケーションがファイルを作成、アクセス、および書き込むときにファイルタイムを記録します。
そのため、ここで間違った値を設定すると、1600年代の日付を簡単に取得することができます。
もちろん、もうひとつの重要な疑問は、この値がどのように設定されたのか?実際の日付はどうなっているのか?それは単にファイルシステムドライバの計算ミスである可能性があるので、決して知ることはできないと思います。33があります。)
64ビットデータ型の使用は、Windowsが(一般的に)従来のUnixシステムにあった2038年問題の影響を受けないということを意味します。(Unixは秒単位で、Windowsはマイクロ秒/ナノ秒単位で動作しているにもかかわらずです)。
もちろん、古いバージョンのVisual Studioでコンパイルされた32ビットプログラムを使用する場合、Windowsはまだ影響を受けているのですが。
新しいUnix系OSでは、データ型が64ビットに拡張6されており、この問題は回避されています。(実際、Unixのタイムスタンプは秒単位で動作するため、新しいラップアラウンドデートは今から2920億年後になります)。
好奇心旺盛な人のために - ここに計算方法があります。
@corsiKa
で説明されています。29247 / 365 / 4 ≈ 20実際にこれを設定してみて]9同じ年号になった人もいます。
もしあなたが、いくつかの推測についてあまり悪いと感じないのであれば、私に説明をさせてください。誰かが無意味な値を設定したという意味ではなく、それは常に起こりうることです。)
Unixの時刻は通常、1970年からの秒数を使用します。一方、Windowsでは、1601年を開始年として使用します。ですから、もし問題が2つの時間の間の間違った変換であると仮定すると(これは大きな仮定です!)、表現されるはずだった日付は実際には2011年のいつか(1970 + 41)で、間違って1640(1601 + 41)に変換されたと想像できます.EDIT: 実は、Windowsの開始年を間違えていました。実際の作成時刻が2010年であった可能性もありますし、別のミスがあった可能性もあります(ソフトウェアでは1つ違いというのはよくあることです:D)。
この年は、問題のファイルに関連するトラッキングの日付の1つであることを考えると、かなりもっともらしい説明だと思います :)
この手の質問にはいつも通り、Raymond Chen'さんのブログにこれに関する回答があります"Why is Win32 epoch January 1, 1601?" from the entry from March 6, 2009:.
FILETIME
構造体は、1月1日からの100ナノ秒の間隔で時間を記録します。 1601年1月1日からの100ナノ秒の時間間隔です。なぜその日付が選ばれたのでしょうか?グレゴリオ暦は400年周期で動いており、1601年はその1年目にあたります。 Windows NTが設計された当時は、この周期の最初の年でした。 1601年です。つまり、計算がうまくいくように選ばれたのです。 ということです。
このことは、Dave Cutlerからのメールで確認済みです。