日付を最短3文字で表現する方法

#日付を表すフォーマットは用途によって多種多様

##日本語で年月日を表記した場合

例えば日本語で「2020年10月8日」って書くと、それだけで半角13文字分(全角を2バイトとすると13bytes)のスペースを食いますよね？それを、西暦・和暦併記で、更に曜日までつけて書くと「2020(令和2)年10月8日(木)」で24bytes（和暦と曜日を囲う括弧を半角とした場合）。

###Excelで西暦と和暦を併記する方法
「セルの書式設定」＞「表示形式」で「日付」から「ユーザー定義」に変更します。

```hogehoge.xlsx
セルの書式設定 ＞ 表示形式 ＞ ユーザー定義

種類(T):
yyyy(ggge)"年"m"月"d"日"(aaa)

表示結果:
2020(令和2)年10月8日(木)
```

ちなみにaを4つ並べて書くと、こうなります。

```hogehoge.xlsx
セルの書式設定 ＞ 表示形式 ＞ ユーザー定義

種類(T):
yyyy(ggge)"年"m"月"d"日"(aaaa)

表示結果:
2020(令和2)年10月8日(木曜日)
```

これを今日じゃなくて、別の日にしてみましょう。例えば、今よりもっと桁数の多かった、平成2桁時代。2018年12月31日だったらどうなるか？

```hogehoge.xlsx
セルの書式設定 ＞ 表示形式 ＞ ユーザー定義

種類(T):
yyyy(ggge)"年"m"月"d"日"(aaaa)

表示結果:
2018(平成30)年12月31日(月曜日)
```

全角を2bytesとすると、30bytes。もし括弧が全角だったら、34bytesも食うんですね！

##よく使われている表記法

最もよく使われている日付表記は、「yyyy/mm/dd」方式だろう。これなら、最長でも10bytesで済む！

###それでも、用途によっては、やっぱり長く感じる

でも、Excelなんかで何枚もシートが連なってるようなケースでは、シート名は長いと鬱陶しいので、「20201031」のようにyyyymmdd形式で8文字で書く人は結構多いと思います。

###西暦の下2桁から書いてみる

場合によっては、西暦下2桁から書いて「201031」みたいにする。でもこれって、去年までは「191031」みたいに書いたら「2019年の上2桁を省略したんだな」って瞬時に気づくけど、例えば、2020年10月11日を西暦下2桁からの6桁表記で書くと「201011」。書いた本人はyymmddのつもりでも、読み手が「yyyymm」だと勘違いして、「2010年11月」と解釈してしまう可能性もあり、なんだか厄介。

##だったら、もっと短くしてみよう！
###まずは、月を1桁で表してみよう
皆さんは、普段、何を使って通勤していますか？昨今のコロナ禍により、在宅勤務されているかたもいらっしゃるかもしれませんが、通勤している方は、鉄道やバスなどの公共交通機関を利用していると思います。通勤定期券は、首都圏ならSuicaやPASMO、京阪神エリアならICOCAやPiTaPaのような交通系ICカードと一体化したものを利用している方が多いかと思います。

###ちょっと昔ならどうしてた？
それでは、首都圏の皆さんに質問です。現在のように交通系ICカードが主流となる前の時代には、どんなものがあったか覚えていますか？
私鉄各社共通で使えた「パスネット」を利用していた方、裏面には何が書かれていましたか？
日付や利用区間、残高が印字されていましたね（ご存じない方は、SuicaやPASMOの履歴印字をイメージしてみてください）。実はパスネットの日付欄は、3桁分しか確保されていなかったのです。
10月、11月、12月にはそれぞれ英字のX、Y、Zが割り当てられていました。これは、16進法でいうA、B、Cと同じですね？！例えば、12月31日なら、「Z31」と印字されていたのです。
京阪神エリアで利用できた「スルッとKANSAI」は4桁表記（現在のSuicaやPASMOの履歴印字と同じ）だったので、関西の方は、こんなところに16進法が応用されていたなんて、イメージが湧きづらいかもしれませんね。。。

```
10月以降は16進法で表記する

1  2  3  4  5  6  7  8  9 10 11 12
1  2  3  4  5  6  7  8  9  A  B  C
```

##月はわかったけど、日は16進法じゃ解決できないよ！
日は最大で31日まであるので、当然ながら、16進法では1桁で表記できません。
ここで、最大が「31」であることに注目してみましょう！！

```math
31=32-1=2^5-1
```

###ポケモンの個体値に使われている「32進法」で解決！
皆さんの中には、「6Vポケモン」をつくるのに苦労された方も多いかと思います。
このアルファベットの「V」って何だ？と思った方、16進法では英字はA,B,C,D,E,Fの6種類でしたね？つまり、16進法では、1文字で表現できる最大の数はF、すなわち15なのです。
もし、「G」以降の文字も使ってもよい、と言われたら、

```
16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
 G  H  I  J  K  L  M  N  O  P  Q  R  S  T  U  V
```

と書き表すことができます。
「32進法」は0～31までを、数字の0～9と、アルファベットのA～Vの文字を用いて表現できるのです。
最大値「31」をアルファベットで表すと「V」の文字が使われるので、

* HP
* こうげき
* とくこう
* ぼうぎょ
* とくぼう
* すばやさ

の6つの要素全てが「V」であるポケモンのことを「6Vポケモン」というのです。

ポケモンをやっていない人には「32進法」はあまり馴染みがないかもしれませんが、これを応用して、月を16進法、日を32進法で書けますね？

##月末を2文字で書いてみよう
ポケモンやってた人は、「V」の次に大きい値は「U」、とすぐに出てくるでしょう。
「大の月」はVまで、「小の月」はUまで使います。2月はSまたはTまで使います。

* 1月31日→1V
* 2月28日→2S、閏年の2月29日→2T
* 3月31日→3V
* 4月30日→4U。なんか英語の"For You"みたいですね！
* 5月31日→5V
* 6月30日→6U。6月は「小の月」なので「6V」はありません(笑)
* 7月31日→7V
* 8月31日→8V
* 9月30日→9U
* 10月31日→AV。10月以降は、月も英字になります。(例)10月10日→AA。
* 11月30日→BU
* 12月31日→CV。ちなみに声優さんのCVはCharacter Voiceを略した和製英語。

これで全ての月日が2文字で書けるようになりました。

##年は2000年以降なら下2桁を1文字で表せる

```
00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20
 0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F  G  H  I  J  K
```

あくまで32進法の応用なので、残念ながら1999年以前は1文字表記できません。
えっ？「L」以降の余った英字を逆から使って、

```
99 98 97 96 95 94 93 92 91 90 89 88 87 86 85
 Z  Y  X  W  V  U  T  S  R  Q  P  O  N  M  L
```

とすれば1985年まで遡れるじゃないか、って？
その考え方、悪くはないのですが、来年(2021年)になったら「L」も使うので、1986年までしか遡れなくなってしまい、1985年は「遡れる年」から外されてしまいます。そして2022年(M)には1986年が、更にその翌年の2023年(N)には1987年が「遡れるリスト」から外れてしまい・・・

```
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
 L  M  N  O  P  Q  R  S  T  U  V  W  X  Y  Z
85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
```

上記のように、毎年「遡れなくなる年」が1つずつ増えていきます。
2035年に「Z」まで使うので、1999年も「遡れる年」から外され、完全に2000年以降しか表記できなくなります。

##この方法は2035年までしか使えない

もう、お気づきかと思いますが、この方法は2035年までしか使うことができません。
2036年になったら、使えなくなってしまうので、予めご了承ください。

今日が2020年10月8日なので、3文字表記すると、

* 2020年10月8日→「KA8」

となります。西暦下2桁から6桁表記で「201008」と書くよりスリムになったかと思います。

* 2020年10月9日→「KA9」
* 2020年10月10日→「KAA」
* 2020年10月11日→「KAB」
* 2020年10月12日→「KAC」某ゲーム会社の大会みたいですね(笑)
* 2020年10月13日→「KAD」
* 2020年10月14日→「KAE」
* 2020年10月15日→「KAF」
* 2020年10月16日→「KAG」ここで「日」に16進法にはない「G」を使います。

このように、年と日は32進法、月は16進法を使うので、

* 年→「K」まで(2020年現在。使おうと思えば「36進法」で2035年の「Z」まで表現可能)
* 月→「C」まで
* 日→「V」まで(大の月)

の英字を使うことになります。

###やっぱり3文字全てが英字になるとややこしいと感じる方へ
どうしてもこの時期(10-12月)は10日以降月末まで3文字全てが英字となり、ややこしいと感じる方は、「日」だけ数字2桁を用いて4桁表記とし、

*「2020年12月31日」→KC31

などとしてみてはいかがでしょうか。

###雑記：ファミコン時代のスーパーマリオの残機表示
今年35周年を迎えた国民的ゲーム「スーパーマリオブラザーズ」の残機表示、1985年当時は1桁しか想定されていなかったようで、マリオの残機が10人以上になると、残機表示の前に「王冠のマーク」が現れ、1upキノコなどで残機が増える毎に、

* 10人→王冠0
* 11人→王冠1
* 19人→王冠9
* 20人→王冠A

となり、以下「36進法」に基づいて、

* 41人→王冠V(ポケモンの「V」が31なので、+10して41が「王冠V」です)
* 42人→王冠W
* 43人→王冠X
* 44人→王冠Y
* 45人→王冠Z
* 46人以上→王冠マークの右の表示がバグる

とだんだん表示がおかしくなっていき、符号つき8bitの限界を超えるとゲームオーバーとなります。
「3-1」などのゴール手前の階段でカメキックして無限増殖をやり過ぎてゲームオーバーになった人も多いのではないでしょうか。私もその一人ですが(笑)