1641年にどのようにしてファイルを「作成」できましたか?


75

数年前、私はファイルサーバーでこのファイルを見つけました。

Microsoft Windowsのファイルプロパティダイアログのスクリーンショット

また、1641年に作成されたとファイルに表示する方法はありますか?私の知る限り、PC上の時間は1970年1月1日からの秒数によって定義されます。そのインデックスがグリッチした場合、1969年12月31日を得ることができます(インデックスはおそらく-1を示します)が、これには困惑しています一見ランダムな日付であり、アメリカ合衆国の設立よりも前の日付です。

では、1641年のファイルの日付はどのようになっているのでしょうか?

PS:日付はフランス語です。Févrierは2月です。


29
「私の知る限り、PC上の時間は1970年1月1日からの秒数で定義されます。」-システムがある場合でも、1970年より前の日付は、その番号(UNIXタイムスタンプとして知られる)を負にすることで簡単に表されます。たとえば、Unix時間-1000000000は1938-04-24 22:33:20に対応します。
-marcelm

1
@marcelmはい。ただし、32ビット整数の範囲が限られているため、最小可能日は1901年です。
-slhck

14
@slhck:marcelmは64ビットのタイムスタンプを想定していたと思います。これは、現在のUnix / Linuxファイルシステム、カーネル、およびユーザー空間ソフトウェアが使用しているものだからです。の定義については、clock_gettime(2)manページを参照してくださいstruct timespec。これはstat、ユーザー空間とカーネルの間でタイムスタンプを渡すために使用されるシステム呼び出しや他のシステム呼び出しです。これはtime_t、秒単位およびlong tv_nsecナノ秒単位の構造体です。64ビットシステムでは、両方とも64ビットであるため、タイムスタンプ全体は128ビット(16バイト)です。(あまりにも詳細をごめん、私は
ピーター・コーデス

3
1600年代の日付をどのようにファイルにスタンプすることができるかについて、良い答えが得られました。今度は、それがどのように発生したかを考える時間です。そのwpファイルの内容を非常に詳細に見て、何が追加されたのかを確認します。私はインストールされたプラグインを見て、どれも怪しくないことを検証します。私は何かがそのファイルを変更し、ファイルが変更されたがウィンドウ時間ではなくUNIX時間を指定したことを隠すために、変更/作成された日付を手動でスタンプしようとしたと考えています。
トーマスカーライル

2
ルイ13世王は、PHPに対する王室のコミットメントを示していましたか?
ジェシースライサー

回答:


106

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です。

一部の人々は実際にこれを設定しようとし、同じ年を思いついた。


7
記録のために、Unix(または少なくともLinux)はtime_t64ビット型の64 ビットアーキテクチャのカーネル/ファイルシステムの2038問題を既に解決しているため、 アプリケーションはtime_t32ビットの整数型の代わりに、とにかく、誰かが問題のステータスに興味がある場合、レガシー32ビットを除いてほとんど解決されます。2038年に32ビットARMが引き続き関連する場合はIDKですが、これにより少なくともABIの変更が強制されます。Unixの世界では32ビットx86はほとんどなくなっています。32ビットコードがまだ一般的なのはWindowsだけです。
ピーター

コメントは詳細なディスカッション用ではありません。この会話はチャットに移動さました
ジャーニーマンオタク

1
VMS時間は「17-Nov-1858 以降に経過した100ナノ秒間隔の数を表す64ビット値です。:)
ロンジョン

30k年は...驚くほど低い
ジョンドヴォルザーク

2
@DonaldDuck blogs.msdn.microsoft.com/oldnewthing/20090306-00/?p=18913と約1600人がまだユリウス暦を使用しており、それ以前の日付をより複雑に表現していました。
マチェイピエチョトカ

16

推測についてあまり気に入らない場合は、説明をさせてください。そして、私は「誰かがナンセンスに値を設定する」という意味ではありません、それは明らかに常に可能です:)

Unix時間は通常1970年以降の秒数を使用します。一方、Windowsは開始年として1601を使用します。したがって、2回の間で問題が間違った変換であると仮定すると(そしてそれは大きな仮定です!)、表現されるはずの日付が実際には2011年(1970 + 41)のどこかにあると想像できます。1640(1601 + 41)まで。編集:実際、私はWindowsの開始年に​​間違いを犯しました。実際の作成時間は2010年であったか、または別のエラーが関係していた可能性があります(ソフトウェアでは、オフバイワンエラーはかなり一般的です:D)。

今年は問題のファイルに関連付けられた追跡日付の別の日であることを考えると、私はそれがかなりもっともらしい説明だと思う:)


だから、日付はUnixで書かれていたかもしれませんが、UTCで読まれていますか?
Fredy31

Windowsは1600ではなく1601を使用
Joey

3
その理論に関するいくつかの問題:スクリーンショットによると、ファイルは最後にアクセスされてから11日に作成されます。また、Windowsタイムスタンプは100ナノ秒でカウントされますが、UNIX時間は秒単位です。
ノロナー

2
@Joey Ugh、私の間違い。それは一見よりもフィット感をはるかに悪くします:)私は同じ基本的な考え方はまだ機能するはずだと思いますが、おそらく私が想定したよりも多くのエラーが関係しています。または、もちろん、ファイルが2010年に作成された、2011年ではない
Luaan

2
Windowsエポックと表示されたファイルの日付/時刻との間の秒数は1.266.705.294です。Unixエポックに追加すると、2010-02-20 23:34:54 CESTになります。これは土曜日でした。
SQB

5

他の人が書いたように、Windowsエポックは1601-01-01 00:00です。

そのエポックと表示されるファイル時間との間の秒数は1.266.705.294です。
それをUnixエポックに追加すると、土曜日の2010-02-20 23:34:54 CESTに到達します。これは最終アクセス日から約1年前であり、ある程度妥当と思われます。したがって、誤ったエポックに対して解釈されたUnixタイムスタンプである可能性があります。


奇妙なことに、.NETエポックは0001-01-01 00:00 UTC(1600年前)です。参照してくださいmsdn.microsoft.com/en-us/library/...
Nayuki

2

これらのタイプの質問でいつものように、Raymond Chenのブログには、「Win32エポックが1601年1月1日である理由」からこれに関する回答があります。2009年3月6日からのエントリー:

FILETIMEその日が選ばれたのはなぜな構造は、1601年1月1日以降の100ナノ秒間隔の形式で時刻を記録しますか?

グレゴリオ暦は400年のサイクルで動作し、1601はWindows NTが設計された時点でアクティブだったサイクルの最初の年です。言い換えれば、数学がうまく出てくるように選ばれました。

実際に、これを確認するDave Cutlerからのメールがあります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.