Posted on

使いどころは知らない

フランス革命歴CCXXIV年フリミエール(3月)25日(五曜日)3時81分。
このブログを書き始めた日本標準時を(いくつかの前提をつけて)フランス革命歴に計算しなおしてみました。

ええ、今年9月に入社して3か月半、このブログのためにネタを探した結果がこのざまです。

そもそも、そんな計算をしようと考えたのはphpにjdtofrenchなる関数が存在しているのを知ったからです。
ユリウス積算日をフランス革命歴に変換するという関数で…

http://php.net/manual/ja/function.jdtofrench.php

フランス革命歴が実際に使用された、わずか14年足らずの間は
この関数でフランス革命歴に変換できるそうなのです。

世間には西暦だけじゃなくて、皇紀だったり、他の紀元年も存在すれば、
和暦でもあえて今年を昭和から数えて91年と言ってみたり、ときとして”あえて使われていない暦年で言及する”
なんていうネタがありますけれど、さすがにjdtofrenchではそのネタに使えない。
たった14年足らずしか使われていなかったから、関数もその範囲で計算を打ち切ってます。
(当然といえば当然)
だから、自分で現在時刻をフランス革命歴に換算するのを組んでみたというわけです。

フランス革命歴は…詳しいことはご自分で調べてください。とりあえず、要点は

  • 1792年9月22日(秋分)が紀元
  • 30日12か月+年末に追加日5~6日
  • 曜日は日付の下一桁(10日周期) 追加日は曜日無し
  • うるう年に明確なルールはなかった(年始を秋分に合わせようとしていたらしい)
  • 1日=10時間, 1時間=100分 1分=100秒

jdtofrenchが1806年以降に対応していないのは、フランス革命歴が実際に使われていた時期だけに対応するほか、
XX年以降のうるう年が決まっていないから、ということによるものだそうです。
なので、今回換算するにあたって、グレゴリオ暦の秋分を常に年始に合わせることにしました。
おおむね、グレゴリオ暦と同じ周期でうるう年が出る計算になります。

秋分の日の計算はこちらを使わせていただきました。
http://php.o0o0.jp/article/php-equinox_day

//グレゴリオ暦$year年秋分の日00:00:00のタイムスタンプ
function autumn_equinox($year){
    $aeqday = floor(23.2488 + 0.242194 * ($year - 1980)) - floor(($year - 1980)/4);
    $aeqdate=mktime(0,0,0,9,$aeqday,$year);
    return $aeqdate;
}
$nowdate=strtotime("today");
$nowdatetime=strtotime("now");
//現在日時から日付(00:00:00)を引いて今日の経過秒数を求める 【1】
$nowclock=$nowdatetime-$nowdate;

//グレゴリオ暦1970年秋分=革命歴CDXXIX年ヴェンデミエール1日
$year = date('Y',time());
$fy=$year-1970+179;
//今年の秋分
$aeqdate = autumn_equinox($year);

//秋分前なら前年、秋分以降なら今年の秋分の日が革命歴の年始
if($nowdate<$aeqdate){
	$fy--;
	$ffirst=autumn_equinox($year-1);
}else{
	$ffirst=$aeqdate;
}

//革命歴年始からの日数
$ftdays=($nowdate-$ffirst)/(60*60*24);

//革命歴は30日x12か月+うるう日5~6日、よって30で割れば解決
$fm=floor($ftdays/30)+1;
$fd=($ftdays%30)+1;
//曜日は10日周期
$dn=$fd%10;

//1日=革命歴10時間=革命歴1000分=革命歴100000秒
//革命歴1秒=1/100000日=グレゴリオ暦0.864秒
//革命歴経過秒数を求める
$ftsecond=floor($nowclock/0.864);

//革命歴10000秒ごとに革命歴1時間【2】
$fhour=floor($ftsecond/10000);
//革命歴1時~10時になるように調整
if($fhour<1) $fhour=10;
//革命歴1時間未満の革命歴100秒ごとに革命歴1分
$fminute=floor(($ftsecond%10000)/100);
//革命歴1分未満の革命歴秒を求める
$fsecond=$ftsecond%100;

あとは$fyから$fsecondを適当に整形する感じです。

【1】において、strtotime(“now”)が現在時刻、strtotime(“today”)が今日の00:00:00を意味しているから、
単純に引いてその日の経過秒数を使えるようにするというひと手間が要りました。
フランス革命歴下では、1秒の長さすら変化するゆえの策でした。
タイムスタンプが累計秒数だからできる荒業、でしょうか。これで、
【2】の剰余演算は%演算子を使う方向に統一しました。(fmodで計算する方法もあった。どちらが良かったのだろう)

暦年換算は、1秒の長さすら変わる暦年でもなければこれほど大掛かりなものにはならないかとは思います。
逆に、これほど大掛かりなものをわざわざ作ってみたことで、タイムスタンプは結局”ただの秒数”だと
再発見できたわけですし…

現在時刻をフランス革命歴に変換できる、という奇特なネタを身に着けることができた、というわけです。

現在時刻、(フランス革命歴)4時23分!