Windows 秘話

ファイル プロパティのタイムスタンプの進化

Raymond Chen

Windows 95 の時代、ファイルのプロパティ ダイアログ ボックスのタイムスタンプ情報は、その特定の時点でアクティブなタイム ゾーンでない時刻についても、ローカルのタイム ゾーンに基づいて表示されていました。たとえば、現在レドモンドでは太平洋標準時刻を使用しているため、Windows 95 では、すべてのタイムスタンプが太平洋標準時刻を基準に表示されます。その結果、7 月 4 日の正午に作成したファイルのタイムスタンプを冬に確認すると、タイムスタンプは同日の午前 11 時になります。これは、太平洋夏時間の正午は、太平洋標準時刻の午前 11 時と同じ時点を指すために起こる現象です。念のためにお伝えしておきますが、レドモンドでは 7 月 4 日には太平洋標準時刻を使用していません。ですが、これは (直感的には間違っていたとしても) 技術的には正しい情報です。

太平洋夏時間 (米国以外の国と地域では、サマータイムと呼ばれることが多いです) の対極にある時間 (標準時) を処理する際、マネージ コードとアンマネージ コードの間には注目すべき相違が見られます。従来、アンマネージ コードでは、世界協定時刻 (UTC) と変換時のローカル タイム ゾーンのローカル時刻との間で変換を実行していました。ファイルが作成された時点のタイム ゾーンに基づいたローカル時刻ではありません。この理由の 1 つは、ファイルが作成された時点のタイム ゾーンを基準にすると、あいまいさが生じたり、時間を変換できなくなってしまうためです。たとえば、標準時から夏時間への切り替え時に、米国では時計の針を午前 2 時から午前 3 時に進めます。現地時刻では午前 2 時 30 分は存在しないので、午前 2 時 30 分という現地時刻は UTC の時間と対応しなくなります。さらに悪いことに、夏時間から標準時への切り替え時には、時計の針を 1 時間巻き戻すので、現地時刻では 2 時 30 分が 2 回訪れており、午前 2 時 30 分という現地時刻はあいまいになります。

ファイルが作成された時点のタイム ゾーンを使用しない、もう 1 つの理由は、多くの場合、OS には、過去の特定の時点で使用されていたタイム ゾーンを把握するために必要な情報が含まれていないためです。標準時と夏時間を切り替える際の規則は、地方自治体によって異なる場合があります。また、最近まで、一定の規則が制定されていなかった国 (イスラエル、ブラジルなど) もあり、これらの国では、その都度、標準時と夏時間を切り替える日時を決定していました。過去または未来の特定の時点において、その時点で使用されているタイム ゾーンを確信を持って特定するのは困難であり、未来の時点について、タイム ゾーンを特定するのは不可能です (標準時と夏時間の切り替えが標準化される以前の時刻を変換する際には、何かしら意味のある情報が得られることをお祈りします)。

一方、マネージ コードの System.DateTime クラスでは、ファイルが作成された時点のタイム ゾーンを特定するために最善を尽くします。そのため、より直感的に正しいと思える時刻が提示されますが、アンマネージ コードが不安定になるような例外的な場面に遭遇したときには時刻の変換に失敗することがあります。

タイムスタンプの進化に話を戻しましょう。Windows 2000 では、タイムスタンプの形式がわずかに変更され、現在の日付から 1 日前後の日付については、昨日、今日、または明日と表示されるようになりました。たとえば、ファイルを作成した日にプロパティ ダイアログ ボックスを確認すると、"作成日時: 2009 年 2 月 14 日、7:00:00" と表示されるのではなく、"作成日時: 2009 年 2 月 14 日、今日 7:00:00" と表示されます。根本的な変更ではありませんが、このような見栄えを良くするための視覚的な微調整が行われました。

Windows Vista では、タイムスタンプの時刻が少しわかりやすくなりました。時刻と日付が今日の日時である場合、タイムスタンプの時刻は "作成日時: 2009 年 2 月 14 日、今日 15 分前" というように、相対的な時刻で表示されます。

最新 OS である Windows 7 のファイルのプロパティ ダイアログ ボックスの [全般] タブでは、現在時刻を基準にしたタイムスタンプではなく、ファイルが作成されたときに現在の場所で使用されていたタイム ゾーンを基準にしたタイムスタンプが表示されます。その結果、プロパティ ダイアログ ボックスには、マネージ コードでタイムスタンプを表示した場合と同じ時刻が表示されるようになりました。これで冬の間でも、7 月 4 日の正午に作成したファイルが、同日の正午に作成されたものとして表示されるようになります。この変更により、タイム ゾーンの夏時間に関する規則を毎年変えられる、いわゆる新しい動的なタイム ゾーンを利用することができます。そのため、Windows では、レドモンドで 2006 年 10 月 30 日に作成されたファイルは太平洋標準時刻で作成されており、2007 年 10 月 30 日に作成されたファイルは太平洋夏時間で作成されたということを把握できます。この違いは、2007 年に施行された米国における夏時間の規則の変更によるものです。

ただし、Windows に同梱されている過去の情報を使用しても、1987 年より前の年代にさかのぼることはできないので注意してください。1987 年より前の夏時間に関する規則は異なっていたため、1987 年より前のタイムスタンプは適切に変換されない可能性があります。

タイムスタンプの解釈について行われた変更により、異なるバージョンの Windows で同じファイルを確認すると、タイムスタンプは 1 時間早い時刻または遅い時刻になる場合があります。これはタイムスタンプ自体が変更されたのではなく、Windows の表示方法による違いです。

Raymond Chen は、自分の Web サイト「 The Old New Thing (古くて新しいもの、英語)」および同じタイトルの著書 (Addison-Wesley、2007 年発行) で、Windows の歴史、Win32 プログラミング、そして新しい職場への移転について触れています。

関連コンテンツ