玄関雑学の部屋雑学コーナー閑話閑人
○年月日と通算日数の相互変換

西暦2000年問題に関連して、年月日と通算日数を相互変換する方法を紹介しましょう。 例えば自分が生まれてから正確に何日たったか知りたい時のように、ある年月日からある年月日までの正確な日数を知りたいことがあります。 そのために、西暦年月日をある時点を基点とした通算日数に変換する方法が色々と考案されています。

天文学分野では、フランスの古典学者のスカリーゼという人が、グレゴリオ暦が採用された1582年に提唱した、「ユリウス日」というものを用いることがあります。 当時は旧約聖書の記述が本気で信じられていて、アダムとエバの生誕、つまり人類誕生の時期が紀元前4000年頃と考えられていたことと、計算の都合上から、ユリウス日では紀元前4713年1月1日を基点として0日とし、その日からの通算日数を計算します。 その際、紀元前4713年から1599年までの6312年間はユリウス暦を使ったとして、1年の日数を365.25日とし、1600年以後はグレゴリオ暦を使ったとして、1年の日数を365.2425日として計算します。

6312は4の倍数なので、紀元前4713年から1599年までの6312年間の日数は6312×365.25=2305458日ときっちりした日数となり、1599年12月31日のユリウス日は2305457日となります。 したがって1600年1月1日は2305458日となるはずですが、1582年にユリウス暦からグレゴリオ暦に改暦した時に、10月5日から14日の10日間をとばしていますので、1600年1月1日のユリウス日は2305448日となります。 さらに1600年は閏年ですから2月は29日まであり、この日のユリウス日は2305507日となります。

この数字に基づいて、1600年3月1日以後は次のような式でユリウス日を計算することができます。

ユリウス日=2305507+int[{146097×(c-16)}/4}+int{(1461×y)/4}+int{(153×M+2)/5}+d
c:西暦年数の上2桁
y:西暦年数の下2桁
M:西暦3月からの月数、すなわち月>2の時はM=月-3、月≦2の時はM=月+9としてyから1を減ずる
d:西暦日
int():切り捨てによる整数化関数

この式を用いて1997年10月23日のユリウス日を求めてみると、2450745日になります。 (←暇な方は検算してみてください。(^_-))

ユリウス日を用いると、その日の曜日を簡単に求めることができます。 すなわち、ユリウス日を7で割った時の余りが次のような曜日に対応します。

0:月曜 1:火曜 2:水曜 3:木曜 4:金曜 5:土曜 6:日曜

例えば1997年10月23日については、2450745を7で割った時の余りは3ですから木曜となります。

コンピュータで日数計算をする時は、わざわざユリウス日を計算することはなく、前述の式の2305507を省略し、1600年3月1日を1日目とした通算日数を計算するか、次のような簡略化した式で通算日数Dを計算することが多いようです。

D=int{(146097×c)/4}+int{(1461×y)/4}+int{(153×M+2)/5}+d
c、y、M、d、int():前述のものと同じ

この式で計算した通算日数は、全てグレゴリオ暦を使ったと仮定した時の、仮想的な紀元前1年(計算上は紀元0年とする)3月1日を1日目としたものとなります。

この通算日数を利用して、僕が生まれてから今日(1997年10月23日)までの経過日数を計算すると、次のようになります。

本日:1997年10月23日…729626日
生誕日:1952年12月24日…713252日
経過日数=16374日

興味のある方は、この方法を利用して自分が生まれてから今日までの日数を計算してみてください。

またこの計算式を利用すると、仮想的な紀元前1年3月1日を1日目とした通算日数Dから、西暦年月日を逆算することができます。

c=int{(4×D-1)/146097}
D=int[{(4×D-1) mod 146097}/4] と置き直して
y=int{(4×D+3)/1461}
D=int[{(4×D+3) mod 1461}/4]+1 と置き直して
M=int{(5×D-3)/153}
M<10の時はm=M+3、M≧10の時はm=M-9としてyに1を加える
d=int[{(5×D-3) mod 153}/5]+1
D:仮想的な紀元前1年3月1日を1日目とした通算日数
c:西暦年数の上2桁
y:西暦年数の下2桁
m:西暦月
d:西暦日
int():切り捨てによる整数化関数
Y mod X:YをXで割った余り

さらにこの式を応用すれば、ユリウス日を西暦年月日に変換することも簡単にできます。 これらの式を利用して、西暦年月日とユリウス日を相互変換する簡単なプログラムを組むことができます。 暇な方は、これらの式で西暦年月日と通算日数が相互変換できる原理を考えてみてください。 そしてもっと暇な方は、西暦年月日とユリウス日を相互変換するプログラムを考えてみてください。(^_-)

○太陽歴と閏年

通常、カレンダーの上での1年を「暦年」といい、太陽の動き、すなわち地球の公転周期に基づいた天文学的な1年を「太陽年」といいます。 現在の暦年は平年では365日、閏年では366日ですが、太陽年は観測と理論から平均365.2422日となります。 この太陽年に暦年を合わせるために、古代から色々な暦が工夫されてきました。

ヨーロッパにおける太陽暦の歴史は、古代エジプトで使われていた「エジプト暦」に始まると言われています。 エジプト暦では1年間に30日単位の月が12ヶ月あって、最後の5日間は1年に属さない日としてお祭りをしていました。 この暦ですと暦年は365日となり、4年でほぼ1日の割合で暦年の方が太陽年よりも早く進むことになります。

そこで西暦紀元前45年に、時のローマ共和国皇帝ユリウス・カエサル(ジュリアス・シーザー)が、アレキサンドリアの天文学者リシゲネスの進言を採用して、4年ごとに1回の閏年を入れる「ユリウス暦」を採用しました。 ユリウス暦では4年間を平均した時の1年の日数は、

平均1年日数=(365×3+366)/4=1461/4=365.25日

となり、太陽年との誤差は0.0078日(約11分)となります。

ちなみにユリウス暦を採用する時、従来のエジプト暦とのズレを解消するために、余分の2ヶ月(67日)を加え、さらに2月に23日を加えたため、BC45年は455日あったことになり、西暦上、一番長い1年になっています。 この歴改定で、ラテン語で8を意味するoctoに由来するOctoberが8月から10月に、novem(9)に由来するNovemberが9月から11月に、decem(10)に由来するDecemberが10月から12月になり、僕の学生時代の英語のテストの点を落とす結果となりました。(^^;)

ユリウス暦は長い間ヨーロッパで使われていましたが、16世紀になって太陽年とのズレが10日ほどになり、色々と不都合が生じてきました。 この頃には正確な太陽年が求められていましたので、1582年にローマ法王グレゴリオ13世が、より太陽年に近い「グレゴリオ暦」を定めました。 グレゴリオ暦は400年間に97回の閏年を入れるようにしており、そのために次のような規則で閏年を決めています。

  1. 西暦年数が4で割り切れる年は閏年とする。
  2. ただし年号が100でも割り切れる場合は閏年とはしない。
  3. ただし年号が400でも割り切れる場合は閏年とする。

以上まとめて「西暦年数が100で割れない年については4で割れる年を、100で割れる年については400でも割れる年を閏年とする」とも表現されます。 この方法では、400年間を平均した時の1年の日数は、

平均1年日数=(365×400+97)/400=146097/400=365.2425日

となり、太陽年との誤差は0.0003日(約26秒)となります。 実は、128年間に31回の閏年を入れると、

平均1年日数=(365×128+31)/128=46751/128=365.24219日

となり、400年間に97回の閏年を入れるよりも太陽年との誤差が少なくなります。 このことはグレゴリオ暦を作る時にもわかっていたのですが、128年間に31回の閏年を合理的に配置するのは難しいので、より使いやすい現行の方法が採用されたのです。 グレゴリオ暦は1万年間で3日ほど太陽年よりも遅れることになりますが、実用上はほとんど問題なく、現在も世界標準の太陽暦として利用されています。 ちなみにグレゴリオ暦を採用する時、従来のユリウス暦とのズレを解消するために、10月4日の翌日を10月15日としたため、1582年は西暦上一番短い1年になっています。

以上のようなヨーロッパの暦においては、1年の基点を定めるにあたって、エジプト暦の名残(年の最後の5日間の祭り)と、冬至と春分が重要なポイントにとなりました。 古代からゲルマン民族は、冬至の日を中心として太陽の再生を祝う冬至祭を行っていました。 そのためキリストの生誕日も冬至とされ、冬至祭とキリスト生誕を祝うお祭りが一緒になり、冬至にクリスマスを祝っていました。 そしてキリストは生誕後8日目にユダヤ教の割礼を受けたと言われていたので、クリスマスから8日後を1月1日として1年の起点にしていました。

またキリスト教徒にとってクリスマスと並んで重要な日である復活祭は、春分の頃(春分後の最初の満月をすぎた日曜日)に祝っていました。 そしてユリウス暦では春分は3月21日と決められていたので、その日を春分付近に持ってくる必要がありました。 そこで現行のグレゴリオ暦を採用する時、春分が3月21日付近となるように1年の基点が定められ、月と年との日数調整と閏年の日数調整は、2月にまとめて処理されることになりました。

日本の旧暦すなわち太陰太陽暦では、農耕に都合の良いように立春を1年の基点とし、これが正月元旦付近になるように暦を定めていました。 そのため明治時代に太陽暦を採用する時に暦が1ヶ月ほど早くなってしまい、古来の季節感と暦とが1ヶ月ほどずれてしまいました。 例えば旧暦では”新春”の元旦は立春前後であり(現在でも年賀状に「新春」とか「迎春」と書くのはその名残です)、3月3日の”桃の節句”の頃には桃の花が咲き、5月頃には”五月雨(梅雨)”が降りました。

お祭などの行事は七夕のように日付が重要なものは新暦でも同じ日に行いますが、季節感が重要なものは旧暦よりも約1ヶ月遅れの日に行うことが多いようです。 例えばお盆はもともと旧暦の7月15日の行事でしたが、新暦になって本来の季節とずれが生じたので、”月遅れ”の8月15日に行うようになりました。

太陰太陽暦であった旧暦からグレゴリオ暦に切り替わったのは1872年のことです。 この年は明治5年であり、この年の旧暦12月3日が新暦の明治6年1月1日となりました。 つまり、明治5年12月3日〜30日という日付は幻の日付となったわけです。

1ヶ月近い期間が消えてしまったわけですから、当時の人々は「時間を1ヶ月損した!」とか「寿命が1ヶ月縮まった!」などと思い込み、「時間を返せ〜っ!」と明治政府に文句をつける人達もいたそうです。 またもっとセコイ話として、当時、明治政府は財政が逼迫していて、官吏に支払う給料を1ヶ月ごまかすために新暦に切り替えたという裏話があります。 (^^;)

○西暦2000年問題(Y2K問題)

西暦2000年になった時、一部のコンピュータが日付を正しく処理できなくなり、コンピュータ処理が混乱してしまうという問題のことで、マスコミが煽り立てたため、1999年の年末に馬鹿げた空騒ぎが起こりました。

この問題は一部のハードウェアやソフトウェア(特に初期に設計されたメインフレーム関係)が、日付の西暦年情報を下2桁しか処理していないことに起因します。 MS-DOS系のパソコンが日付を処理するメカニズムは、だいたい以下のようなものです。

  1. ハードウェアであるCMOS RTC(Complementary Metal Oxide Semiconductor Real Time Clock chip、シーモス・アールティーシー、内部リアルタイムクロックチップ、通常マザーボード上に存在)が、「西暦下2桁年−月−日」という形式でハードウェア日付情報を保持。

    普通、この日付はコンピュータの電源が落ちている時でも、バッテリバックアップによって常に更新されています。

  2. コンピュータの立ち上げ時に、ハードウェアとソフトウェアの中間で、最も基本的な入出力を処理するファームウェアであるBIOS(Basic Inuput/Output System、バイオス)がCMOS RTCから日付情報を取得し、西暦年の上2桁を補って「西暦4桁年−月−日」という形式に変換する。
  3. コンピュータとユーザーを仲介する基本ソフトウェアであるOS(Operating System、オーエス)がBIOSから日付情報を取得し、それを1980年1月1日からの通算日数に変換して保持。

    このソフトウェア日付情報は、必要に応じて「西暦4桁年−月−日」という形式に変換され、各種アプリケーションソフトに提供されます。

  4. 各種のアプリケーションプログラムはOSあるいはBIOSから日付情報を取得し、独自の日付処理を行う。

    アプリケーションによっては年を2桁で処理したり、西暦を和歴に変換するなど、独自の日付処理を行うことがあります。

独自の日付処理
アプリケーションプログラム←┐
1980年1月1日からの通算日数
OS
西暦4桁年−月−日
BIOS─┘
西暦下2桁年−月−日
CMOS RTC

MS-DOS系のパソコンにおける2000年問題は、CMOS RTCがハードウェア日付情報の西暦年を下2桁しか保持していないことに主な原因があります。 つまり1999年(99年)の翌年は「00年」になってしまい、1900年なのか2000年なのか区別できないわけです。

OSのソフトウェア年情報は4桁ですから、1999年から2000年になった時、OSが作動している間は正しい年情報を保持する場合があります。 しかし一旦電源を落として再度OSを立ちあげると、CMOS RTCの「00年」という日付情報で初期化され、間違った日付(日付変換アルゴリズムの関係で、たいていは1980年1月4日)になってしまいます。

したがって2000年問題をクリアするためには、BIOS、OS、そしてアプリケーションプログラムの各レベルにおいて、それなりの対策を講じる必要があります。

パソコンは新しい設計思想を取り入れるのが早いため、西暦年を4桁で保持するCMOS RTCや、CMOS RTCから取得した日付情報を4桁に変換する時、2000年問題を考慮して変換するBIOSやOSが、1999年当時、すでに普及していました。 そのため2000年問題にひっかかる機種はあまり多くありませんでしたが、古い機種の中にはまだ十分な対策が取られていないものがありました。

しかしたとえ十分な対策が取れられていなくても、せいぜいコンピュータの時刻表示が狂う程度で、コンピュータシステム全体が暴走するような危険性はほとんどありませんでした。 事実、2000年になった時に、コンピュータシステムが暴走したという現象は全く起こりませんでした。

ところが煙も無いのに火事だと大騒ぎするマスコミが、「200年1月1日午前0時にコンピュータが狂い、コンピュータによって管理されているシステム全体が暴走する!」といった取り上げ方をして、大げさに危機感を煽り立てました。 その結果、1999年12月31日から2000年1月1日にかけて、多くの会社や公共施設で、不測の事態に備えて沢山の担当者が徹夜で待機するという、無意味で馬鹿げた空騒ぎが起きたのです。

この手の「××××年問題」というのは他にも沢山ありますが、それらはマスコミには知られていないため、知る人ぞ知るという状態で何事もなく過ぎ去っています。 西暦2000年問題も、マスコミが煽り立てさえしなければ馬鹿げた空騒ぎは起こらず、一部のコンピュータ専門家以外は誰も知らないうちに何事もなく過ぎ去ったことでしょう。

たとえ問題が起きたとしても、せいぜいどこか田舎のお役所で使っていた古いコンピュータが、新年の事始めの時に間違った時刻表示をし、ニュース枯れに困った地方新聞がそれを取り上げて、紙面の片隅に「新年のコンピュータ珍事」といった小さな記事になった程度だったでしょう。(^^;)

○Windows-NT 名前の由来

Microsoft Windows-NTの「NT」は、公式には「New Technology」の略ということになっていますが、この名前について面白い裏話があります。 Windows-NTはDEC社の有名なOSであるVMSを設計したDavid N. CutlerがMicrosoftに招かれて設計したOSです。 彼は開発したOSを「進歩したVMS」と位置付け、「VMS」のアルファベットを1つ進めた「WNT」から「Windows-NT」と命名しました。 そしてその後から「NT」に「New Technology」という語呂合せをこじつけ、それを表向きの名前の由来にしたというのです。

この裏話は有名なSF小説&映画「2001年宇宙の旅」(アーサー・C・クラーク原作、スタンリー・キューブリック監督、1968年)に登場する、印象的なコンピュータ・HAL9000の名前の由来を思い起こさせます。 作品中ではHAL9000型コンピュータは「Heuristically-programmed ALgo-rithmic computer(発見的能力をプログラムされたアルゴリズミック・コンピュータ)」の略だと説明されていますが、その実、「IBM」の1つ前のアルファベットである「HAL」に由来することは、SFファンの間ではよく知られた裏話です。

海外のコンピュータ研究者や技術者にはこの種の遊び心を持った人が多いので、Windows-NTについても、さもありなんという気がします。

○Altoマシン

Altoマシンは、1970年代にアメリカ・ゼロックス社のPARC(Palo Alto Re-search Center)にあるコンピュータ研究所によって開発されたワークステーションの原形です。 このコンピュータはビットマップディスプレイ、マウス、GUI、ネットワーク機能といった、当時としては非常にユニークな機能を備えていましたが、プロトタイプだけ作られて、残念ながら実際には製品化されませんでした。 しかしこのAltoマシンのコンセプトに注目したMIT(マサチューセッツ工科大学)のコンピュータ研究者は、当時、ミニコンから汎用機まで多種類のコンピュータの標準OSとなりつつあったUNIX上で同様の機能を実現し、「X-Window」と名付けました。

またPARCを見学したスティーブ・ジョブズを中心としたアップル社のエンジニア達は、このAltoマシンを見て大いに感銘を受け、開発中だった新型コンピュータMacintoshの設計を根本からやり直し、現在のようなウィンドウ方式のMac-OSを開発しました。 そしてMS-DOSの次に来るべきOSを模索していたMicrosoftは、CP/MとUNIXを手本としてMS-DOSを作ったのと同様、AltoとX-WindowとMac-OSを手本としてMS-Windowsを開発しました。

X-Windowは「X-Window」という名前ではなく、「X(エックス)]という名前のウィンドウシステムのことです。 つまりAltoマシン以後、コンピュータ世界においては、「Window」という言葉はウィンドウシステム一般を表すようになっていたのです。 ところがそれを複数形にした「Windows」をMicrosoftが登録商標にしてしまったため、少々ややこしいことになりました。 同社のワープロソフト「Word」でも同様の命名をした上、バイナリーファイルである文書ファイルの拡張子を、テキスト形式のドキュメントファイルの拡張子として昔から汎用されていた「.DOC」にするという暴挙を行いました。 このように、一般名に近い言葉を強引に登録商標にしてしまうのはMicrosoftの得意技ですが、全く困ったもんです。(~.~)

またWindowsが発売された当初、Appleから「WinodwsはMacのマネだ!」と非難されたMicrosoftのビル・ゲイツは、次のような居直りの反論をしています。

「WindowsはMacをマネたんじゃなくAltoをマネたんだ。 だから、Appleから非難されるのは心外だ!」

確かにWindows3.1までは主としてAltoとX-Windowのマネであり、Macのマネを大幅に取り入れたのはWindows95からですから、彼の反論は全くのウソというわけではありません。 しかしいずれにせよ、日本のことわざに言う「目クソ鼻クソを笑う」のたぐいでしょう。(^^;)

本家本元であるゼロックス社においては、Altoマシンのコンセプトはオフィス用ワークステーションStarに受け継がれましたが、オフィス専用とあってか知名度も普及度もいまいちです。 しかしAltoマシンは現在のワークステーションやパソコンに大きな影響を与えており、コンピュータマニアの間では「幻のコンピュータ」として語り継がれていくことでしょう。