GWの工作 ISO8601カレンダーOrdinal Dateに十進化時間機能と年パーセンテージ機能を追加

 By : CC Fan


今年の初記事として書いたISO8601カレンダーでWeek Date(週番号)とOrdinal Date(年内の日)を表示し、「1年に対する相対的な経過時間」(もうこんなに1年も過ぎたぞという戒め)を常に知りたい、と言う記事。

時間の流れを意識したいね!という事で長い周期(1年)にフォーカスした各種表示を常に表示しようという試みでした。
今回、Twitter上での会話からより戒められそうな表示を思いついて実装したので、ゴールデンウィークの工作、という事で記録しておきたいと思います。

まずは前回作った物から…




このカレンダーは常時開いている宅内サーバーの操作ターミナルに表示され続けているので、時間の流れを常に感じるとともに一年がどれぐらい過ぎた、と言う一種のプレッシャーも意識する良い刺激として使えていました。

さて、5月1日は平年のOrdinal Dateでは121日目になり、1年365日のおおよそ3分の1になるので、 と言うツイートをして、もう3分の1が終わったか、やらなきゃいけないことが溜まってる…とか思案していると…
いつもお世話になっているaccuris_kunihondenさんもその早さに驚き、リプをいただきました。

この会話でふと思いついたのが、Ordinal Dateと言う形で1年に対する時間の流れを可視化しているものの、最大値が365日(366日)と十進数基準では「中途半端」な値なので、イマイチ実感し辛いのではないか?という事です。

これを「俺のコンプリケーション」として分かりやすく表示すれば面白いのでは?という事で検討します。
365日を000~999の3桁の十進数で「キリの良い値」変換すればいい、と言う方針を決め、検討します。
999は365よりも大きいので、日付だけを使っているとカウントが1ずつ進まなくなるため、少なくとも時刻までの情報を使わないといけなさそうです。

365日を時間表記すると8760時間であり、8760は999より大きいため、時刻単位で計算すれば3桁十進数で1ずつ進むカウントが出来ることが分かります。
逆に、1年/1000=0.001年に相当する時間は8.7時間であり、8.7時間ごとにカウントが1進むともいえます。

4桁にすると0.87時間=約52分ずつ進みますが、後述するように表記が雑多になると感じたので3桁にしました。

Ordinal Date+時刻を時間表記に変換、それを「1年の長さの時刻」で割れば求める値を得ることが出来ますが、「1年の長さ」と言うのは一定ではないという事を次に考えました。

その年の長さ、を取得することもできますが、この処理は画面描画の度に呼ばれるのでできれば決め打ちにしたいな…と考え、閏年基準にするか、平年基準にするか検討し…
グレゴリオ暦の1年の平均日数は365.2425日(平年が303年、閏年が97年の400年平均)なので、これを使うのが良いんじゃないか?という事で採用。
この値を使う問題は閏年の年末0.7575日(18時間)は本来想定していない1000を超える値が出てくることですが、まあそれは4年に18時間ならいいかで許容する、とシンプルにすることに。

ここまで決めたら、.tmux.confを書き換えて実装。
最終的に、三桁整数(パーミル相当)よりもパーセントと小数表示の方が慣れてる、という事でパーセント表示にしました。
5月1日で、Ordinal Dateは121日、1年に対して33.3%(3分の1)の進捗なのが分かります。
パーセントは四桁表示も試しましたが、雑多な印象の方が強くなるので三桁に戻してしまいました。

また、Ordinal Dateに組み合わさっていた西暦表示は冗長なのでこの機会に削除し、ISO8601準拠ではなくなり独自拡張っぽくなりました。
そして、どうせ独自拡張になるならもう一つOrdinal Dateに入れたいと思っていた拡張も入れることにします。

Ordinal Dateの整数部分は日付の情報なわけですが、それに[0,1)の小数として時刻情報を追加すれば同時に「1日に対する相対値」も分かるのではないか?と言う拡張です。
これは0:00:00~23:59:59を0.000~0.999に対応させるという意味でスウォッチが規定したスウォッチ・インターネットタイムと似た考え方で、十進化時間と呼ばれる「十進数を使ってるんだから時刻系も十進数で表そう」という試みの一種でもあります。

ただ、時刻系としてみると既存の時刻からの変換がめんどくさい、という欠点もあるのは実感しており、個人的には時刻そのものと言うより「1日に対する相対量」で日付と時刻を一つの数値で表せる、という事を重視しています。
この考え方は別の場所で導入していて、コンピューターが起動してからの時刻を表すuptimeという数値が標準では日数と時刻に分かれて表示されるのを一つの値で表現できないか?と考えた結果、整数部が日数、3桁の小数部が1日未満の相対値、と言う表現にしていました。
この考え方をOrdinal Dateも同じで、日付情報(整数部)に時刻(小数部)を足せばいいと気が付いたわけです。
こちらも実装。
ついでに並び方を変え、Calendar Date・Time・Ordinal Date関連の順番にしました。

2023年5月2日は122日目(整数部)、22:03は0.917日(小数部)と一つの数値で日付と時刻を表現できています。
さらに、122.917日で1年の33.6%が経過した、とも表示しています。



並び順や各部の色、処理方法はデバッグしながら修正するかもしれませんが、表示の方法論としてはかなり好みのものが出来た、と考えています。
Week Date側に移動した方が良いかも…?

これからも色々考えていきたいです。

最後に需要があるかは微妙ですが、この表示を実現する部分を貼ります。
.tmux.confに入れてご使用ください。
ワンライナーで処理してますが、いい加減分けた方が良いかも…とは。

set-option -g status-right-style "bold,fg=cyan"
set-option -g status-right "%Y-%m-%d #[fg=brightgreen]%H:%M #[fg=brightyellow]%j#(date " scale=3;%-H/24 %-M/1440" | bc)(#(date " scale=1;(%j*24 %-H)/87.6582" | bc)%)#{?mouse, #[fg=brightred]M,}"
set-option -g status-right-length 40