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が終わったか、やらなきゃいけないことが溜まってる…とか思案していると…5月
— CCFan (Watch Media Online) (@CCFan_WMO) April 30, 2023
おおよそ1年の3分の1(365/3≒121)が経過…
通年日カレンダーは無慈悲だネ! pic.twitter.com/hOY8aPZsFx
いつもお世話になっているaccuris_kunihondenさんもその早さに驚き、リプをいただきました。もー3分の1!? ああああああああ!
— accuris_kunihonden (@kunihonden) April 30, 2023
この会話でふと思いついたのが、Ordinal Dateと言う形で1年に対する時間の流れを可視化しているものの、最大値が365日(366日)と十進数基準では「中途半端」な値なので、イマイチ実感し辛いのではないか?という事です。
これを「俺のコンプリケーション」として分かりやすく表示すれば面白いのでは?という事で検討します。
365日を000~999の3桁の十進数で「キリの良い値」変換すればいい、と言う方針を決め、検討します。と言うわけで、一年を十進三桁カウンター(000〜999)で表示するコンプリケーション?を考える https://t.co/E8lotY7Xv6
— CCFan (Watch Media Online) (@CCFan_WMO) May 1, 2023
999は365よりも大きいので、日付だけを使っているとカウントが1ずつ進まなくなるため、少なくとも時刻までの情報を使わないといけなさそうです。365(366)<999なので、1日刻みの計算だとカウントが飛ぶ
— CCFan (Watch Media Online) (@CCFan_WMO) May 1, 2023
最低でも時間ベースで計算する必要があり適当に見積もる
365日は8760時間、365日を1年として、0.001年は8.7時間とすれば通年日*24 時刻を割って変換すればそれなりに正確だろう
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日(平年)とすると8760時間、366日(閏年)とすると8784時間、365.25日(3年の平年と閏年の平均値)とすると8766時間で、簡略化のために閏年判定は省きたい
— CCFan (Watch Media Online) (@CCFan_WMO) May 1, 2023
その年の長さ、を取得することもできますが、この処理は画面描画の度に呼ばれるのでできれば決め打ちにしたいな…と考え、閏年基準にするか、平年基準にするか検討し…
グレゴリオ暦の1年の平均日数は365.2425日(平年が303年、閏年が97年の400年平均)なので、これを使うのが良いんじゃないか?という事で採用。グレゴリオ暦の平均日数365.2425日を使えば8765.82時間、トータルの誤差はこれが一番小さいけど閏年の年末に1000を超えるっていう問題はある。
— CCFan (Watch Media Online) (@CCFan_WMO) May 1, 2023
そもそも3桁精度出ればよくない?というものではあるしhttps://t.co/nMEDES4Q8Q
この値を使う問題は閏年の年末0.7575日(18時間)は本来想定していない1000を超える値が出てくることですが、まあそれは4年に18時間ならいいかで許容する、とシンプルにすることに。
ここまで決めたら、.tmux.confを書き換えて実装。
最終的に、三桁整数(パーミル相当)よりもパーセントと小数表示の方が慣れてる、という事でパーセント表示にしました。組み込んだ。
— CCFan (Watch Media Online) (@CCFan_WMO) May 1, 2023
3桁有効数字+%が一番慣れてるだろう、という事でこうなった。 pic.twitter.com/eq4okvolo1
5月1日で、Ordinal Dateは121日、1年に対して33.3%(3分の1)の進捗なのが分かります。
パーセントは四桁表示も試しましたが、雑多な印象の方が強くなるので三桁に戻してしまいました。
また、Ordinal Dateに組み合わさっていた西暦表示は冗長なのでこの機会に削除し、ISO8601準拠ではなくなり独自拡張っぽくなりました。
そして、どうせ独自拡張になるならもう一つOrdinal Dateに入れたいと思っていた拡張も入れることにします。
通年日の方もuptimeカウンターと同じ方法で小数点付きにすればいいのでは?と言う思いつき
— CCFan (Watch Media Online) (@CCFan_WMO) May 1, 2023
Ordinal Dateの整数部分は日付の情報なわけですが、それに[0,1)の小数として時刻情報を追加すれば同時に「1日に対する相対値」も分かるのではないか?と言う拡張です。
これは0:00:00~23:59:59を0.000~0.999に対応させるという意味でスウォッチが規定したスウォッチ・インターネットタイムと似た考え方で、十進化時間と呼ばれる「十進数を使ってるんだから時刻系も十進数で表そう」という試みの一種でもあります。
ただ、時刻系としてみると既存の時刻からの変換がめんどくさい、という欠点もあるのは実感しており、個人的には時刻そのものと言うより「1日に対する相対量」で日付と時刻を一つの数値で表せる、という事を重視しています。
この考え方は別の場所で導入していて、コンピューターが起動してからの時刻を表すuptimeという数値が標準では日数と時刻に分かれて表示されるのを一つの値で表現できないか?と考えた結果、整数部が日数、3桁の小数部が1日未満の相対値、と言う表現にしていました。コンピューターが起動してからどれぐらい時間が経ったか、を表示するカウンタです。
— CCFan (Watch Media Online) (@CCFan_WMO) May 1, 2023
↓の表示で、上側の2.295って書いてあるシアン色の数字がそれで、これは2日と0.295日(7時間弱)経っていることを示しています。
標準的には日付と時刻で表示するんですが、十進化した方が分かりやすくない?と… pic.twitter.com/DiCbVa8F04
この考え方をOrdinal Dateも同じで、日付情報(整数部)に時刻(小数部)を足せばいいと気が付いたわけです。
こちらも実装。黄色部分が年通算日(整数部分)+3桁の十進時刻(小数部分)、年内の割合(カッコ内の%) pic.twitter.com/Qf1jmOuNfY
— CCFan (Watch Media Online) (@CCFan_WMO) May 2, 2023
ついでに並び方を変え、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
COMMENTS
コメントを投稿する
※ 匿名(ニックネーム可)での投稿も可能となっております。