ISO8601 Week DateとOrdinal Dateのススメ(年末年始に寄せて)

 By : CC Fan

あけましておめでとうございます。
今年もWatch Media Onlineをよろしくお願いいたします。

さて、新年に何を書こうか…と考えていたら編集長の大晦日と新年のツイートでタイムリーな話題を思いついたので書きたいと思います。


ランゲの1815のバリエーションとして製作された「1815 Kalenderwoche(=カレンダーウイーク)」はいわゆる「週番号」を表示するコンプリケーションを持ちます。
外周の1週‐52週(年によっては53週)の表示が6時位置のスモセコ同軸の曜日表示が日曜日から月曜日(ドイツ語なのでSON→MON)に切り替わる時に1週分進み、「1年の第何週か?」を直感的に表示する機能です。



似たような機能はパテックフィリップのカラトラバ ウィークリーカレンダー5212A(編集長によるレポートカミネさんによる紹介記事)やヴァシュロンの超複雑時計57260の57機能の内、「12. 曜日番号の表示(ISO 8601カレンダー)」と「13. その年における週番号の表示(ISO 8601カレンダー)」とされて実装されています。


●パテックフィリップのカラトラバ ウィークリーカレンダー5212A

週間雑誌の号数などである程度馴染はあるものの、あまり時計の機能としてはメジャーではない週番号表示ですが、「1年に対する相対的な経過時間」をより細かく(週番号では1/52≒0.019(1.9%)単位)感じることが出来るシステムとしては後述するOrdinal Dateと共に優れた方式ではないかと思います。

この「1年に対する相対的な経過時間」(もうこんなに1年も過ぎたぞという戒め)を常に知りたいので、自分の時計に組み込みたい、と思いつつ機械式でもクオーツでも理想にピッタリのものはないため、長い時間使っているコンピューターのコンソールに表示するところからはじめて結構便利に使っているので紹介します。


ターミナルマルチプレクサーTmuxの設定ファイル.tmux.confを設定し、週番号と曜日(Week Date)、年内の日(Ordinal Date)、通常の年月日(Calander Date)、時刻(Time)を表示しています。
真ん中のWindow listはTmuxが管理するウィンドウ(コンソール)の切り替えのための表示で、カレンダーとは関係ありませんが、逆にそれ以外をカレンダーと時刻で埋めて常に時間の経過を意識する構成になります。

ISO8601はヴァシュロンの57260の説明でも出てきましたがISO(国際標準化機構)が文化圏によってまちまちだった日付・時刻の記述順序をただ一種類、明確に大→小の順序でに標準化したものです。
ISO8601に完全準拠はしていませんが、各セクションはできる限りISO8601の勧告に従って作ったつもりです。

それぞれを見ていきましょう。

Time(時刻)

ISO8601での時刻は24時間フォーマットのみ、各要素を単純につなげたhh(0を省略しない2桁の時間)mm(0を省略しない2桁の分)ss(0を省略しない2桁の秒)の形の基本形式、各要素を:で区切ったhh:mm:ssの拡張形式を基準とし、より細かい単位(ss、mm:ss)を省略したhh:mm、hhと言う形も使用可能とされています。
また、表示している最小単位の桁を小数にしてより細かい数字を表示することも許可されています。
しかし、途中や大きい単位を省略したhh:ssやmm:ssと言う形は許可されていません。

上記の表示では拡張形式で秒を省略した拡張形式hh:mmと言う形で時分をイエローで表示させています。

Calendar date(通常の年月日)

一般的な「日付」と評される年月日の表示です。
ISO8601では各要素をつなげたYYYY(4桁の年)MM(0を省略しない2桁の月)DD(0を省略しない2桁の日)という基本形式、各要素を-(ハイフン)で繋げたYYYY-MM-DDの拡張形式があり、時刻同様より細かい単位は省略可能、上位と中間の単位は省略不可能とされています(特例として基本形式のハイフン無しYYYYMMも不可)。

上記の表示では一般的な日付という事が分かりやすいよう、拡張形式のYYYY-MM-DDフォーマットで、グリーンで表示しています。
ISO8601では日付と時刻はTの文字で連結し、なおかつ時刻の後ろにタイムゾーン(時差指定)を追加することを求めていますが、人間(自分)が読むことを前提に色分けとスペース区切りにしてタイムゾーン指定は省略しているためこのカレンダーは厳密にはISO8601に完全に準拠はしていません。

Ordinal date(年と年内の日)

英語ではOrdinal(序数) date(日付)と言う表現ですが、日本語で何と表現していいのかイマイチわからないのでWikipediaなどで採用されている「年内の日」と言う表現を使用します。

これはその年の1月1日を001として、1月2日を002…1月31日を031、2月1日を032…12月31日を365(閏年は366)とする、すなわち年が始まってから通算で第何日目かをYYYY(4桁の年)DDD(0を省略しない3桁の日付)という基本形式か、Calendar date同様に-(ハイフン)を区切りとしたYYYY‐DDDの拡張形式で表現します。
DDDの部分を省略するとCalenderの年だけと同じになり、より大きい単位は省略不可なので使う場合はYYYY(-)DDDが必須です。
Calendar date拡張形式で日付を省略したYYYY-MMと同じに見えますが、Ordinal dateはハイフンより後ろが3桁のため区別がつきます。

上記の表示では拡張形式YYYY-DDDでシアンで表示しています。
YYYYはCalendar dateと常に同じなので冗長ではあるのですが、ISO8601にCalendar dateとOrdinal dateをを1つのフォーマットの中に同居させる方式がない(という私の認識)ため、独立した二つのセクションとして表示しています。

Week date(年と週番号と曜日)

「ISO week date」と呼ばれる主にビジネス用に使われる週番号のフォーマットで、YYYY(4桁の年)W(固定接頭語)ww(0を省略しない2桁の週番号)D(月曜日を1、日曜日を7とした曜日)と言う基本形式か、ハイフンで区切ったYYYY-Www‐Dと言う拡張形式で表現します。
週は年の開始曜日によって52週または53週になり、週番号は最下位の曜日が日曜日(7)→月曜日(1)になった時に位上がりして1増加します。

表示ではYYYY-Www-Dの拡張形式でマゼンタで表示していますが、これだけWindow listの左側にあるのは表示幅の問題もありますが、上でYYYYと記載されている4桁の年表示がCalendar dateとは異なるタイミングで切り替わり、そのルールが複雑であるためです。

まず、wwはDが7→1に変化するタイミング(日曜日から月曜日)でしか変化しません、YYYYYも同様にwwが52または53(前年の最終週)から01(今年の最初の週)に変化するタイミングで変化しますが、これは年の切り替わりが1月1日ではなく、「最初の週(W01)の月曜日」になることを示しています。
では、W01はどう決めるのか?と言うと、ISO8601の定義としては「開始年の最初の木曜日を含む週」とされています。
これが何を示しているかは1年が始まる曜日を全パターン書き下してみれば理解しやすいと思います。


「最初の木曜日を含む」と言うのは、言い換えれば「一週間のうち多数派の年に所属する(多数決・半数切り上げ)」と同じであり、別の定義である「1月4日を含む週がW01」も同じことを言っていることが分かります。
また、この表からわかるようにCalendar date(またはOrdinal date)の年要素とWeek dateの年要素の切り替わりタイミングは最大で3日間の先行または遅れがある、という事が分かります。
それを踏まえてみると、2023年は1月1日が日曜日であり、Week dateの切り替えが1日送れるはずですが…


検証ヨシ!
Week dateは2022‐W52-7(2022年の第52週目の日曜日)であり、Calendar dateは2023‐01‐01なので、Week dateが1日遅れ、と言う上の書き下した表の一番下(青色でハイライト)と同じ状態になっていることが確認できました。
そして、2023年1月2日は最初に載せたように…



2023‐W01‐1(2023年の第1週目の月曜日)になっていることが分かります。
このカレンダー処理は私が書いているわけではなく、Tmuxが内部的にstrftimeを呼んでいるので大丈夫な「ハズ」ですが、今回改めて検証できてので良かった良かった…と。



Week dateとOrdinal dateは一般的な月日で見ていると「薄まってしまう」1年365日に対する経過時刻がキリキリと真綿で締めるように表示する、と言う意味で結構良いのでは?と考えながら使っています。


●左から周針が「53」、「1」、「2」を指している「1815 Kalenderwoche」のYG、PT、PGの各モデル

コンピューターで便利なので、編集長の1815のようなWeek dateベースの時計に3桁のOrdinal dateカウンター(ビックデイトの応用?)を追加した「俺のカレンダーウォッチ」はたまに考えてはなかなかまとまらない…
年末処理をクロノのゼロリセットみたいにすれば…とは思う。