読者です 読者をやめる 読者になる 読者になる

「PCの時計が1時間ずれている」の原因の解説

先日公開した記事に割と反響がありまして、ブコメに疑問点などを上げてくださった方もいます。そこで(私の憶測を含みつつも)少し基本的な内容から解説を加えたいと思います。また最後に再発を防ぐためにどうすべきかについても私の考えを書きました。

RTCとOS上の時刻について

RTCはパソコンに内蔵されているデジタル時計のようなものです。電源がOFFの間も時刻が消えてしまわないようにコイン電池で動作しています。

OSは起動時にRTCから現在時刻を取得します。逆にOS上で時刻を修正した場合はRTCに時刻を書き込みます。また、RTCはさほど精度が高くないこともあり、定期的にインターネット上のNTPサーバーから現在時刻を取得しRTCに書き込むということも行われます。最近のWindowsではデフォルトでマイクロソフトのNTPサーバーを参照しています。

タイムゾーンや夏時間の扱いについて

RTCにはタイムゾーンや夏時間を扱う仕組みは一般にはありませんので、OS側でタイムゾーンや夏時間を管理することになります。(実はRTCに夏時間を扱う仕組みがあって誤発動したというのが今回の原因なのですが)

MacLinuxでは、RTCにはUTC(協定世界時)を設定しておきOS側でタイムゾーンや夏時間の時差を足し引きしてローカルタイムを表示しているようです。

Windowsでは、タイムゾーンを変更したり夏時間をまたいだ時に、RTCにローカルタイムを設定しなおすという方法を取っているようです。

RTC の Daylight Savings Enable (DSE) という機能について

現代のOSでは上で述べたようにタイムゾーンや夏時間を管理しているのですが、昔(DOSとかの時代?)はOSはそんな賢い機能はなくRTCの時刻がそのままローカルタイムでした。そんな時代に夏時間を扱うためにハードウェア的に実装されたのが DSE という機能です。

前回の記事であげたIntel 82371ABの仕様にあるように、この機能が有効の場合、RTCの時刻が4月の第一日曜日の1:59:59の次に3:00:00に1時間進みます。逆に10月の最終日曜日に1時間戻ります。

ブコメで「夏時間の切り替えは3月なのになぜ4月に?」というものがありましたが、良い指摘で、実は4月の第一日曜日に切り替えるのは (仕様書にも書いてありますが) 1987年の米国の法律によるもので2007年に法律が変わったため現在は使われていません。このことも DSE が今回の時刻ずれの原因だと考える理由の一つです。

またブコメで「日本のタイムゾーンにしていれば夏時間は自動的にオフになるはず」というものがありましたが、DSEの設定値はOS上の夏時間の設定とは無関係です。OSは上で述べたように夏時間を管理していますのでRTCが勝手に1時間進んだり遅れたりすることは想定していないはずです。したがって現代のパソコンではDSEは無効になっているのが正しいです。

なぜ今回多くのパソコンで1時間ずれが発生したか?

マイクロソフトの)NTPサーバー上でDSEを原因とする時刻ずれが発生し、1時間ずれた時刻が配信されたからだと考えます。去年の10月には起きていなかったことから、ここ半年以内に新規導入したNTPサーバーでDSEが有効になってしまっているのだと思います。

DSEによる時刻ずれ自体は過去にも起きているようで、例えば2016年4月4日にもパソコンの時刻が1時間ずれた事例があるようです。

2016/04/04頃にWindowsの時刻が1時間くらい進んだ件の対処方法 - わかりやすい

誰が DSE を有効にしてしまったのか?

ブコメで「BIOSのせいじゃねーか」というものがありましたが、私もBIOSの不具合なのではないかと考えています。BIOSの設定画面にDSEの設定があるわけではないと思いますが、BIOSがハードウェアを初期化するときに、DSEを無効に設定すべきなのではないかと思います。

少なくとも2015年以前にはあまり話題になっていないと思うので、ここ最近に発売されたパソコンでこの不具合をもつものがある程度存在するというのが現状なのではないかと思います。特定のメーカーのものなのかなどは分かりません。

ちなみに、前の記事でCMOSの Offset 0xB の Bit0 が…と書きましたがこのビットが1だからといって DSE が動作するわけではないようです。私が手持ちのパソコンで試してみたところ動作しませんでした。ハードウェア的にDSEが動作しないものもあるのかもしれません。

再発を防ぐためにすべきこと

ここは私の憶測に基づく提案です。

NTPサーバーの管理者さん (含むマイクロソフト

今回ずれた時刻を配信したNTPサーバーはDSEが有効である可能性が高いです。現在時刻を修正するだけだと10月にまたずれた時刻を配信してしまいます。

基本的には、サーバーのハードウェアを提供しているベンダーに問い合わせてDSEを無効にする方法を提供してもらうのが良いのではないかと思います。(BIOSアップデートなど)

ベンターの対応が期待できないなら、仕方ないので前の記事の方法でDSEを無効にしてください。。。(お勧めしません)

今回時刻がずれたパソコンをお使いの方

ずれた原因は2つ考えられます。1つは「NTPサーバーからずれた時刻を取得したため」、もう1つは「そのパソコンのDSEが有効になっているため」です。

前者であれば特に対応不要ですが、後者であればまた10月に時刻がずれてしまいます。

原因の判別方法は2つ考えられます。

  • NTPサーバーからの取得を無効にした上で、現在時刻を2017/04/02 01:55にして電源を切る。10分ほどしたら起動して2:05になっていればOK。3:05になっていたらDSEが有効。
  • 前の記事に書いた方法で RW-Everything で CMOS Offset 0xB の Bit0を見る。1ならDSE有効。

DSEが有効だった場合ですが、こちらもパソコンのメーカーに問い合わせるのが良いのではないかと思いますが、最悪、前の記事の方法で無効にできると思います。(繰り返しますが、お勧めではないです)

マイクロソフトに期待すること

出来れば Windows Update で 「DSEが有効になっていたら無効にする」というパッチを配信してもらえるとみんなハッピーだと思います。

最後に

今年の10月の最終日曜日(2017年10月29日) に時刻がずれるパソコンが発生しないことを強く願ってこの記事を書かせていただきました。NTPサーバー管理者やパソコンベンダー、マイクロソフトには適切な対応をぜひお願いします。