2015年6月15日月曜日

時刻と、時間と、うるう秒~Windowsの時計を正確に合わせる~【追記あり】

テレビアニメ「新・エースをねらえ! (テレビアニメ版第2作)」のタイトルみたいになってしまいました。

時の記念日

もう過ぎてしまいましたが、6月10日は「時の記念日」ということで、時間と時刻について取り上げたいと思います。すみません、次は下書きのまま公開するの忘れてました。

「時の記念日」は、1920年に制定された記念日で、天智天皇の時代、日本で初めて時計が稼動した故事に由来します。

Wikipedia「時の記念日」によると、日本書紀に「天智天皇10年4月25日」と記載があり、それがグレゴリオ暦671年6月10日にあたるのだそうです。

それにしても不思議ですね。

日本に元号が導入されたのは、大化の改新から、つまり645年のはずですから、671年は既に元号があったはずです。まだ一般には普及していなかったとは思いますが、天智天皇つまり中大兄皇子は大化の改新の主要人物であり、元号を決めた人のはずです。日本書紀は朝廷の公式歴史書なので、元号が使われていないのは不思議です。

また、旧暦4月25日を、わざわざグレゴリオ暦に直しているのも不思議です。こちらは、「時の記念日」を制定した東京天文台と生活改善同盟会に聞いてみたいものです。

グレゴリオ暦は、現行の暦ですが、採用されたのは1582年です。671年当時はユリウス暦が使用されており、400年に3日のずれが発生します。つまり1週間くらい日付がずれているはずなんです。わざわざ1000年近くさかのぼって計算したのはどういうことなのでしょう。

時間と時刻

ところで、皆さんは時間と時刻の違いを意識しているでしょうか。

「時間」は「時と時の間隔」のことで、経過を表します。「15分の休憩をとります」「演習は60分です」という場合は「時間」です。

「時刻」は「時の刻み」のことで、特定の瞬間を表します。「午後の講義は1時から開始します」「今日の講義は4時半に終了する予定です」という場合は「時刻」です。

日常的には、時刻の意味で「時間」を使うことも多く、「今の時間教えて」と言われればふつうは時刻を答えます。

物理現象を分析するのに大事な情報は、時刻よりも時間です。もともとは、南中(北半球で太陽が真南にくる瞬間)から翌日の南中までの時間を1日=24時間と定義し、1時間の60分の1を1分、1分の60分の1を1秒としたものです。

しかし、実際には1日は正確に24時間ではありませんし、1年も正確に365日ではありません。

うるう年(うるう日)

「1年」は地球の公転周期なので、自転がベースになっている「1日」とは無関係です。

1年は約365.2422日なので、4年に1日足すと、1年あたり365.25日となり、年間誤差は0.0078日になります。足した1日のことを「閏(うるう)日」といい、1日足した年のことを「うるう年(leap year)」と呼びます。

グレゴリオ暦以前に使われていたユリウス暦はこのルールです。

ユリウス暦では、1000年経つと1週間以上ずれが発生します。そこで、グレゴリオ暦では以下のルールになりました。

  • 4年に1回にうるう年を作る
  • 100年に1回、本来ならうるう年でもうるう日を追加しない
  • 400年に1回、本来ならうるう年にしないところ、やっぱりうるう年にする

これで400年に3日(1年あたり0.0075日)減らせるため、年間誤差は0.0003日になります。

ちなみに 356÷365.2422=0.9993 となります。多くのクラウドサービスのSLA(サービスレベルアグリーメント)は99.95%程度なので、ざっくり言うと「クラウドのSLAはうるう年くらい」となります(偶然の一致です)。

うるう秒

地球の自転は毎年微妙に変動しています。長期的には、潮汐がブレーキになって1日の時間は徐々に長くなっておきます。

その他、ランダムな変動要素があり、実際には自転速度は増減があります。これを放置して時間だけ正確な時計を使うと、時刻がどんどんずれていきます。

そこで、時刻調整のためにあるタイミングで1秒増やしたり減らしたりします。これが「うるう秒」です。過去のうるう秒は常に挿入されてきましたが、実測値に基づいて決定されるため、今後は分からないそうです。

次回のうるう秒挿入は、2015年7月1日午前9時直前(日本時間)に行われます。時刻案内では「8時59分59秒」のあとに「8時59分60秒」を読み上げて「9時ちょうど」になります。

うるう秒は何かと面倒なので、なくしてしまおうという議論はあります。

「60秒」という時刻は不正な値ですから、万一その瞬間に時刻を扱ったプログラムがエラーを起こす可能性があります(実際、過去に起きています)。また、うるう年のような決まった規則はなく、観測の結果ずれてきたら挿入するというルールですから、あらかじめプログラムすることもできません。

「どうせずれても、わずかなものなので、うるう秒をなくしてしまってもいいんじゃないか」ということですね。実際、日常生活で数秒ずれても大きな問題はありません。

一方で「太陽が南中したときが正午でないと気持ち悪い」という意見もあります。「どうせ、今住んでいる場所と国の標準時では何分かずれているので、そこを気にしても仕方ない」という意見もあります。特に中国はタイムゾーンが1つしかなく、両端では相当の差があります。

ただ、このあたりは感覚的なものもあるので、なかなか決着が付かないようです。

では、現実にどうするか、ですが、ほとんどの場合は何もしなくて問題ありません。たいていのコンピュータは、数秒のずれはふつうにあるので、そもそも問題にならないからです。

しかし、大きな問題になるソフトがあることも事実です。

なるほど、と思ったのは「NTPとの同期を一時的に外す」でした。NTPは、後述する時刻サーバーです。うるう秒の前にNTPとの同期を解除すれば、「59分60秒」という値は発生しません。

うるう秒のあと、NTPとの同期を再開すると、自動的に正しい時刻に徐々に合わせてくれます。NTPは、時刻のずれを検出しゆっくり合わせる機能を持っているからです。

なお、Windowsオペレーティングシステム自体は数秒のずれが問題になることはありません。Active Directoryが使っているKerberos認証はサーバーとクライアントで5分以内の時刻同期が必要ですが、その他は、おそらく問題ないはずです。アプリケーションの仕様だけを確認してください。

NTP

コンピュータの時刻調整を行うWindowsの標準サービスがNTPです。一般に、コンピュータの内蔵クロックは水晶発振子を使った振動をカウントします。PCアーキテクチャでは、本体電源が切れているときは内蔵電池による水晶時計(内蔵時計)が動作しています。OS起動後は、起動時刻を内蔵時計から読み取り、その後はソフトウェア的に時間を加算していきます。

水晶発振子の振動誤差は10のマイナス5乗(1000分の1パーセント)と、非常に小さいのですが、国際標準であるセシウム原子時計に比べると100万倍くらいの誤差があります。また、振動を取り出す回路の問題で、実用的にははるかに大きな誤差が出ます。

そこで、信頼できる時刻サーバーと同期を取ることが考えられました。これが「NTP(Network Time Protocol)」です。

NTPサーバーにはフリーなものがたくさんありますが、遠隔地だと問い合わせてから返事が返るまでの遅延が大きく、正確な時刻が得られません。ワークグループ構成のWindowsは「time.windows.com」をNTPサーバーとして利用するように構成されていますが、このサーバーは米国(I推定)にあるため、お勧めできません。

日本でのおすすめはNICT(情報通信研究機構)が運営するntp.nict.jpです。Twitterではこんな声も出ているのでどんどん使ってください。

Active Directoryドメインに参加している場合は、ドメインコントローラーがNTPサーバーになります。クライアントが勝手にNTPサーバーと同期を取ると問題があるので、GUIも変化し、簡単にはNTPサーバーを指定できないようになります。

そこで、フォレストルートドメインのPDCエミュレーター(通常は最初にインストールしたドメインコントローラー)で以下のコマンドを実行します。

w32tm /config /update /manualpeerlist:ntp.nict.jp,0x9 /syncfromflags:manual /reliable:yes

詳しくは、以下の記事を参考にしてください。少し古い記事ですが、WindowsのNTPに関しては日本でもっとも詳しい記事だと思います。

@IT > Windows Server Insider > 運用
Windowsネットワーク時刻同期の基礎とノウハウ(改訂版)

仮想マシンの場合は、Hyper-V統合サービスにより、物理マシンと時刻同期を行いますが、ドメインコントローラーには独自の時刻同期メカニズムを優先させるため、統合サービスの時刻同期を無効にすべきとされています(Hyper-V 仮想化環境での時刻同期)。

 

【追記】結論: Windowsでは何もしなくてよい

公開後「結局、うるう秒の対応はどうすればいいのか」という意見をいただきました。

WIndowsは、そもそもうるう秒に対応していないため何もする必要はありません。
アプリケーションも「59分60秒」という情報が伝わることもありません。

一時的に1秒ほどずれますが、Windowsは割と積極的に時刻合わせを行うので、すぐに正しい時刻になります。