CVS, Subversionのコミットログの日時が9時間ずれる件

CVSにしろSubversionにしろ、コミットログにはコミット日時を記録する。しかし、コミットログをViewVCやTracリポジトリブラウザで、あるいはcvsコマンドを叩いて参照してみると、時間がちょうど9時間遅れている。
バージョン管理システムに慣れない人はこれを不思議に思うことが多いようで、この件で過去何度か質問を受けたことがある。

これは設定ミスでもなんでもない。9時間遅れの時間が表示されるのが正しい。

時間がずれているように見えるのは、バージョン管理システムが時間をUTC協定世界時)で管理しているためである。これに対して、日本で使っているタイムゾーンであるJST日本標準時)は、UTCより9時間進んでいる。よって、バージョン管理システムに時間を問い合わせると9時間遅い時間を返してくるように見えるのである。

そして、リポジトリそのもののタイムゾーンを変更する手段は無い。全てのバージョン管理システムがそうなのかはわからないが、とりあえずCVSSubversionはそうだ。たとえリポジトリを載せているマシンのタイムゾーンを変更しても、それらには無関心にUTCを使い続ける。

これには理由がある。

オープンソースプロジェクトで使われているリポジトリを見ればわかることだが、リポジトリは世界中の開発者から利用される場合がある。ところが、地球には時差があるため、開発者たちの時計はそれぞれ異なる時間を指している。リポジトリで時間を管理する際、いったい誰の時計を基準とすべきだろうか?こうなると、全ての時間の基準となっているUTCを使うのがベストなのだ。

WinCVSTortoiseCVSのような自分のPCにインストールして自分だけが使うツールであれば、そんな事情は気にする必要がない。だから、これらでログを参照すると、時間は我々の目に入る前にJSTに加工される。しかし、Webベースのリポジトリブラウザのように、サーバサイドで動いて不特定多数から参照される可能性があるアプリケーションではUTCを使わざるを得ないのである*1

ちなみに、これは$Id$, $Date$, $Log$をキーワード置換する際にも問題になってくるはずである。しかし、ヘタにツールを噛ますよりは、そういうものだと受け入れた方がよろしい。単純に9時間足せば良いわけだし。もっとも、キーワード置換の使用自体オススメできないので、可能であれば無くしてしまうべき。

*1:TracJaのようにローカライズしてあるものは別。