突然ですがSilverlightでアナログ時計を作ってみました。
はい、そうですね。
おかしいです。
本来12時のところが0になっています。
でもこれはつまらないバグでこうなったのではありません。
わざとです。
この背景には緻密(?)なロジックがあります。
実は、時計の文字盤はこうであるべきなのです。
今回はユーザーインターフェースの話です。
なんだか冗談のような話ですが、論理は完璧に通っています。
私が考えたのではなく、某所で聞いてなるほどなと思った話ですが・・・。
どういう事かというと、
時計の文字盤から12時を抹殺せよ!!
12時はユーザーインターフェースとして不条理だ!
という話です。
12時→0時
ということですね。
こういう話ではない
ここまでの話を聞いてこう思われる方もいらっしゃるでしょう。
「なるほど。
これはインデクスを0から始めるか1から始めるかという話だな。
現在主流のプログラミング言語では配列の添字を0からスタートさせる。
物を数えるときは0番目から始めるんだ。
だからそれを時計の文字盤にも当てはめようということか。」
いいえ違います!
全然違います。
ものの数え方を0から始めるか1から始めるかなどは慣習で、どうでもいいことなのです。
(さすがにいきなり12番目から数え始めるというのは問題ですが)
その程度の話なら誰も12時を抹殺しようとは言わないでしょう。
ここで大切なのは「1からスタートしない」ということではなく、「スタートは0から」ということなのです。
ここには根本的な誤解があります。
実は、12時を持つ普通の文字盤も、「1からスタートしない」のです。
もちろん「スタートは0から」というわけでもありません。
普通の文字盤は、12からスタートしているのです。
大きな数からスタートする
ややこしいので図にしてみましょう。
普通の文字盤は、次のように時間が進行していきます。

午後や午前は、まず12時からスタートします。
大きな数からスタートするのです。
そこから何故か数が減って、1時となります。
そしてその後は普通に数が増えて2時、3時…となります。
これが12が存在することの理不尽な点です。
普通、物を数えるときには小さな数から大きな数へと推移していきます。
しかし普通の文字盤は違うのです。
はじめに何故か大きな数がやってきて、その後いきなり小さくなり、後はすこしずつ大きくなる。
これを不条理と言わずして何を不条理といえばいいのでしょう!!!?
一方、理想的な文字盤はこうなります。

どうでしょうか。
0から始まりすこしずつ大きくなり11にたどり着く。
これが直感的なものの数え方というものです。
12時があるとプログラムが書きにくい
12時には直感的でないという以上の問題もあります。
時間に関係したプログラムが書きにくいのです。
たとえばある時間と別の時間の時間差を計算するプログラムを書きたいとします。
そのために時間を全て秒に直すとしましょう。
すると直感的にはこのようなプログラムを書きたくなるのではないでしょうか。
(単純化していますが)
enum DayTimePeriod
{
AnteMeridiem = 0,
PostMeridiem = 1
}
int ToSeconds(int day, DayTimePeriod period, int hour, int minute, int second)
{
return day * 24 * 60 * 60
+(int)period * 12 * 60 * 60
+ hour * 60 * 60
+ minute * 60
+ second;
}
DayTimePeriodは午前か午後かを表します。
AnteMeridiemはAM、PostMeridiemはPMです。
このプログラムは一見正しいように見えるかもしれませんが、hourが12の時正確に動作しません。
12の時は特別扱いをして、0として扱ってやらねばならないのです。
このことは、本質的に12時の存在は間違っていて、0時こそが正しいということを暗示しています!!
…もっとも.netならSystem.TimeSpan構造体を使えという話ではありますが。
でも本当に12時を消さなくちゃいけないのか?
「なるほど現行の文字盤に問題はあるようだ。
しかし今まで長年人々が慣れ親しんできた文字盤から12時を消すことなんて今更出来るだろうか?
それよりは午前午後の境界を一時間ずらして「一時~12時」にした方がいいんじゃないかな?」
と考える方もいらっしゃるでしょう。
しかし午前午後の境界をずらすというのはあまり美しい方法ではありません。
0時(旧12時)はその定義が南中時刻に結び付けられています。
地球の自転と太陽の位置とに密接に結びついているのです。
一時間ずらすのはあまりきれいではないのです。
もっともサマータイムはそのずらしを期間限定で行っていますが。
「今更12時を消せない」という点についてはどうでしょうか。
これも疑問が残ります。
過去にこんな例がありました。
摂氏という単位はみなさんご存知ですね。
温度の単位です。
実はこれは昔、逆だったのです。
水が凍っている時が100℃で沸騰している時が0℃でした。
さすがにそれは分かりにくいということで逆転されたのです。
何を言いたいのかというと、逆転ができたのなら一部変更くらいできてもおかしく有りません!!!!
まあそれはともかく最近は0時と言う人も珍しくありませんので文字盤から12時を消すのも心理的抵抗は以前より少なくなっているのではないかと思います。
大切なのは心理的抵抗をどんどん薄めていくことです。
たとえば同僚の前で「12時」と言う機会があったら代わりに0時というのです。
家の中のアナログ時計にシールで0を貼ります(うーん想像してみたら異様な光景です)。
子供たちにシンデレラを読み聞かせることがあったら、魔法が解けるのは0時です。
こうして人々の心理的抵抗が少なくなっていってそれがある閾値に到達したとき、ばっと情勢がひっくり返ると思うのです。
世の中からは12時文字盤が消え、0時型文字盤が普及するでしょう!
・・・・・・どうでしょうか。
0時型文字盤を普及させる気になってきませんか!?
おまけ
Silverlightアナログ時計のプロジェクトファイルです。
MVVMを使うとデザイン画面で針が動くとは思いませんでした。
SilverlightClock.zip