# 以前、ユリウス暦や閏年の話題があったので、fj.sci.astro を選
# びました。もっと適当な NewsGroup があったら振って下さい。
ユリウス暦の正確なカレンダーを作るべく、いろいろと調べてみた
所、以下の疑問点にぶつかってしまいました。私の調査能力は限界
に達してしまった様なので、識者の方にご教示願いたいと思います。
判った事。
○ユリウス暦は B.C.46 から。
○カエサル B.C.44 に歿。その後(?)表記の誤解から、B.C.9 まで閏
年を 3 年に 1 度にしてしまう。
○それを改める為、B.C.8 から閏年を休止。4 年に 1 度で再開した
のは A.D.8 から。
疑問点。
○とすると、A.D.1 の 1 月 1 日は JD=1,721,425(正午で)の日曜日?
○B.C.9 まで 3 年毎に閏年だとすると、遡ってとりあえず B.C.42
までは閏年。
その 3 年前、カエサルがまだ生きていた B.C.45 は閏年?
B.C.45~A.D.8 に必要な閏年と、実際に実施した閏年の数を合わ
せようとすると、閏年になる。でも、ユリウス暦開始の翌年がい
きなり閏年?
○とすると、B.C.46、ユリウス暦 1 年 1 月 1 日は JD=1,704,622
の木曜日?
○ユリウス暦の閏日は、2 月 24 日を 2 回にしたって本当?
○月の日数はグレゴリオ暦と同じ。Augustus が 8 月の日数を増や
したというのは神話に過ぎない?
以上です。
ここまでは断片の収集で判った事で、1 つの文章中でこの辺の細か
い事情を説明した物にはまだ出会っていません。探し方が悪いのか、
それとも歴史にはっきり残っていないのか。
特に、最後の項目は Augustus のせいにしている文献ばかりで、真
相がよく判りません。
よろしくお願いします。
Tabby as くろさわ
ta...@yk.rim.or.jp
http://www.yk.rim.or.jp/‾tabby/
http://www.tondering.dk/claus/calendar.html
の、2章あたりは、如何でしょう?
#JDの計算は http://aa.usno.navy.mil/data/docs/JulianDate.html で R.田中二郎
TANAKA Jiro <ji...@nerimadors.or.jp> wrote in
message <87it052...@ace.nerimadors.or.jp>:
> http://www.tondering.dk/claus/calendar.html
> の、2章あたりは、如何でしょう?
フォローありがとうございます。
頑張って読んでみます(ううっ、英文だぁ)。
> #JDの計算は http://aa.usno.navy.mil/data/docs/JulianDate.html で R.田中二郎
この JD 計算は正しくない(と言うか、少なくとも私の意図した物で
はない)様です。1-JAN-0004 が 1,722,519(Tue)という事は、A.D.4
を閏年にしています。平年なら 1,722,520(Wed)になる筈です。
…と言うか、私の考え方が間違っていて、「JD とはそういう物だ」
という定義だったりするんでしょうか。つまり、実際の暦にぴたり
と当てはめる事を考慮していなくて、ユリウス暦は 4 年に 1 度の
閏年をずっと続けていたという前提の上に成立している物だとか。
TANAKA Jiro <ji...@nerimadors.or.jp> wrote in
message <87it052...@ace.nerimadors.or.jp>:
> http://www.tondering.dk/claus/calendar.html
> の、2章あたりは、如何でしょう?
読みました。
「Augustus が 8 月の日数を増やした」という話に「根拠がない」
と言い切っている文献の 2 つ目に、ようやく出会えました。ネット
で「アウグストゥス 暦」で検索しても、伝説の方しかヒットしませ
んから。
# 根拠に誕生日説と戦勝記念説の 2 つがあって混乱している辺りは、
# 伝説の伝説たる所以?
私の情報と疑問は…
○ユリウス暦は B.C.46 から。
→ペケ。B.C.45 から。
○B.C.9 まで 3 年毎に閏年だとすると、遡ってとりあえず B.C.42
までは閏年。
その 3 年前、カエサルがまだ生きていた B.C.45 は閏年?
→マル。
○A.D.1 の 1 月 1 日は JD=1,721,425(正午で)の日曜日?
→マル。
○Augustus が 8 月の日数を増やしたというのは神話に過ぎない?
→マル。
…という所に落ち着きました。
実は MS-DOS 用に UNIX の cal 互換+αの暦表示プログラムを作っ
ていまして、仕様を決める為の質問でした。
形になったので、私のページにソース込みで設置してみました。
strlwr() は Unix にはないので、これだけ自前で持てば BSD など
でもコンパイルでき、 kterm などでは -c も使えるようです。
strlwr() を実現するには tolower() を使っても良いでしょう。
tolower() は ISO/IEC 9899:1990 に含まれるようです。
ちなみにRubyでは標準ライブラリ Date を使うことができます。日
付はDateオブジェクトとして表現され、内部にユリウス日を持って
います。
http://www.ruby-lang.org/ja/man-1.6/?cmd=view;name=Date
% ruby -r date -e 'p Date.new(2002,10,1).jd'
2452549
% ruby -r date -e 't = Date.today; puts t, t.jd'
2002-10-16
2452564
すでにご存知かも知れませんが Date の作者もまた cal 互換の
cal.rb というものを公開しています。これは111行のRubyスクリプ
トで17の改暦に対応しています。短いのはDate.newの引数にグレゴ
リウス暦のはじまった日を指定できるようになっているおかげです。
http://www.funaba.org/ruby.html#cal
ごとけん
GOTO Kentaro <got...@notwork.org> wrote in
message <g8bhoa....@miso.k.notwork.org>:
> strlwr() は Unix にはないので、これだけ自前で持てば BSD など
> でもコンパイルでき、 kterm などでは -c も使えるようです。
フォローありがとうございます。
自身の名前を得て strlwr() しているのは、MS-DOS だと大文字でし
か返してくれなくて、それが厭だったからなんです。
smash case ではない UNIX ではそれをしない方がいいでしょうし、
DOS の他の処理系でも持っていない関数である可能性もご指摘の通
りなので、手元では LSI-C でコンパイルされた時だけ strlwr() す
る様に改良しました。
近い内に Web も更新します。
> ちなみにRubyでは標準ライブラリ Date を使うことができます。日
> 付はDateオブジェクトとして表現され、内部にユリウス日を持って
> います。
Ruby はお気に入り言語なんですが、こちらでの確認はすっぽり頭か
ら抜けていました。
今試してみた所…
% ruby -v -r date -e 'p Date.new(1,1,1).jd'
ruby 1.6.7 (2002-03-01) [i586-mswin32]
1721424
…となりました。こちらもやはりユリウス暦の置閏の混乱期が反映
されていない様で、個人的には不満が残ります。
なるほど。僕は作者でないので理由は分かりませんが、思うにこの
クラスはMeeusのアルゴリズムによってグレゴリオ暦とユリウス暦
だけを扱えるようにし、ユリウス暦からグレゴリオ暦への改暦日は
変更可能にしたけど、ローマの事情に合わせた置閏のそれ以上の詳
細は考慮しないことにしたのでしょう。
このあたり、僕は特にどう動くべきという意見を持ちませんが、も
し、くろさわさんが不安があるのでしたらDateクラスの作者のふな
ばさんに ruby-list メーリングリストあたりで問い合わせてみて
はどうでしょうか? 標準ライブラリですのでRubyのユーザとしては
改良されると嬉しいです。
ところで、くろさわさんの cal.c にあった ymd2jd() を使って紀
元前4713年1月1日のJDを求めると366日になりましたが、これはそ
ういうもの(calに必要ないのでサポートしていないだけ)なのでしょ
うか? Ruby のDateでは Calender FAQ にもあるJDの定義通り0に
なります。
% ./a.out -4712 1 1
JD(-4712,1,1) = 366
% ruby -r date -e 'puts Date.new(-4712,1,1).jd'
0
# 今日までの全部のJDを比較しようかと一瞬思いましたが、cal.c
# に jd2ymd() はないようなのでやめました :)
ごとけん
#include <stdlib.h>
#include <stdio.h>
int
main(int argc, char *argv[])
{
int y = -4712, m = 1, d = 1;
if (argc > 1) y = atoi(argv[1]);
if (argc > 2) m = atoi(argv[2]);
if (argc > 3) d = atoi(argv[3]);
printf("JD(%d,%d,%d) = %ld\n", y, m, d, ymd2jd(y, m, d));
return 0;
}
GOTO Kentaro <got...@notwork.org> wrote in
message <fc0joa....@miso.k.notwork.org>:
> なるほど。僕は作者でないので理由は分かりませんが、思うにこの
> クラスはMeeusのアルゴリズムによってグレゴリオ暦とユリウス暦
> だけを扱えるようにし、ユリウス暦からグレゴリオ暦への改暦日は
> 変更可能にしたけど、ローマの事情に合わせた置閏のそれ以上の詳
> 細は考慮しないことにしたのでしょう。
教えて頂いた Web を手繰っていった所、その様な記述がありました。
「歴史的には間違いだが、ある特定の日を表現する為の方便である
ので、間違いとも言い切れない」と。事情は把握していらっしゃる
様です。
後はコストとバランスするかですね。そんな特殊そうな需要に応え
て実装の手間を掛けるかとか、「他の実装と違うんだけど…」とい
う質問が定期的に舞い込むのに耐えられるかとか :-)
> ところで、くろさわさんの cal.c にあった ymd2jd() を使って紀
> 元前4713年1月1日のJDを求めると366日になりましたが、これはそ
> ういうもの(calに必要ないのでサポートしていないだけ)なのでしょ
> うか?
いえ、ゼロを特異点にして、B.C.4713 は -4713 で扱っていますの
で、ちゃんとゼロになります。
> # 今日までの全部のJDを比較しようかと一瞬思いましたが、cal.c
> # に jd2ymd() はないようなのでやめました :)
こちらは研究中です。改造の元になる jd2ymd() を探している所で、
候補が今の所 4 つ程集まっています。
テストルーチンだけはもう出来上がっていて、日付を発生させての
「ラウンドトリップ検査」と「連続性検査」はするつもりです。
KUROSAWA Takashi <ta...@yk.rim.or.jp> wrote in
message <aojquh$1veg$1...@news2.rim.or.jp>:
> > # 今日までの全部のJDを比較しようかと一瞬思いましたが、cal.c
> > # に jd2ymd() はないようなのでやめました :)
>
> こちらは研究中です。改造の元になる jd2ymd() を探している所で、
> 候補が今の所 4 つ程集まっています。
出来ました。
ymd2jd() も jd2ymd() も、伝統モード(従来の 4 年毎の置閏)と歴
史モード(ユリウス暦の混乱期を反映)を動的に切り替えられます。
JD=0 から 現在までの検査は済ませてあります。
興味のある方は、下記の Web からどうぞ。