2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

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

例えば日本語で「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」であることに注目してみましょう!!

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」などのゴール手前の階段でカメキックして無限増殖をやり過ぎてゲームオーバーになった人も多いのではないでしょうか。私もその一人ですが(笑)

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?