暫定Excel 2019年5月1日を令和元年5月1日、2020年5月1日を令和02年5月1日と表示する

#予定通りMSは対応に失敗した
なにがWindows Terminalだ。
やる気がないならやめろマジで。
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" rid="ltr">これすごい！<br>PowerShell やコマンドプロンプトだけでなく、Ubuntu や Debian などの Linux のターミナルも他タブで叩ける<br>ー<br>［速報］マイクロソフト「Windows Terminal」発表。タブ機能、コマンドプロンプト、PowerShell、SSHなど統合、オープンソースで開発中<a href="https://t.co/UM7LtwVy1X">https://t.co/UM7LtwVy1X</a> <a href="https://twitter.com/hashtag/msbuild?src=hash&amp;ref_src=twsrc%5Etfw">#msbuild</a> <br>ー <a href="https://t.co/6KAmB4K1RB">pic.twitter.com/6KAmB4K1RB</a></p>&mdash; Madoka 🇺🇸4/27-5/8(水)米国なう (@chomado) <a href="https://twitter.com/chomado/status/1125531701986222080?ref_src=twsrc%5Etfw">2019年5月6日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Microsoft、「Windows Terminal」を発表　タブ機能、コマンドプロンプト、PowerShell、SSHなどを統合<a href="https://t.co/wWPKhO302C">https://t.co/wWPKhO302C</a> <a href="https://t.co/EEBhi70OFS">pic.twitter.com/EEBhi70OFS</a></p>&mdash; ITmedia NEWS (@itmedia_news) <a href="https://twitter.com/itmedia_news/status/1125628842205372416?ref_src=twsrc%5Etfw">2019年5月7日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">今日のタイムライン、Microsoft は Windows Terminal で「すごい！さすが Microsoft」と褒められ、次期 Edge への IE 互換モード導入で「やめろ！」と言われててプラスマイナスゼロ感がある。</p>&mdash; mattn (@mattn_jp) <a href="https://twitter.com/mattn_jp/status/1125557949865181184?ref_src=twsrc%5Etfw">2019年5月7日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

まったくどうでもいい。明日のWindowsよりまず元号だ。
予想通りExcelは平常運転でggggee年mm月dd日を入れると、平成31年5月1日になる。
##DateString関数もダメ
http://www.eurus.dti.ne.jp/~yoneyama/Excel/kansu/today.htm
```
=DATESTRING(44143)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126919/51e1797e-1567-2b9a-0b38-cf4552ba821f.png)

#A1に2019/5/1と入力している場合A2に元号に変換した日付を表示
##前提
ただし令和以降はA2は正確な日付ではなく文字列になります。
暫定的な処理です

##TimeZoneを考慮しないケース
A2に入力する数式は以下の通りです

```
=IF(A1>="2019/5/1 00:00:00"*1,IF(YEAR(A1)=2019,TEXT(A1,"令和元年mm月dd日"),"令和"&TEXT(YEAR(A1)-2018,"00")&"年"&TEXT(MONTH(A1),"00")&"月"&TEXT(DAY(A1),"00")&"日"),TEXT(A1,"ggggee年mm月dd日"))

```

###ポイント
日付の文字列を*1にすると日時に変わる。
令和はさらに元年と02年以降で場合分けをする。

##TimeZoneを考慮したJSTの例
###令和元年は4月30日15:00(UTC +09:00)
##Timezoneを考慮する場合のA2の時間は現地時間で入力してください。
UTCで今回は表記します
###A2にはUTC 2019/4/30 15:00

###UTCの場合の西暦から元号への変換式
```
=IF(A2+TIME(9,0,0)>=(DATEVALUE("2019/4/30")+TIMEVALUE("15:00:00")+TIME(9,0,0)),IF(YEAR(A2+TIME(9,0,0))=2019,TEXT(A2+TIME(9,0,0),"令和元年mm月dd日"),"令和"&TEXT(YEAR(A2+TIME(9,0,0))-2018,"00")&"年"&TEXT(MONTH(A2+TIME(9,0,0)),"00")&"月"&TEXT(DAY(A2+TIME(9,0,0)),"00")&"日"),TEXT(A2+TIME(9,0,0),"ggggee年mm月dd日"))
```

###UTCにおける平成と令和の境界をExcelの式で表す
DATEVALUE("2019/4/30")+TIMEVALUE("15:00:00")
###これに日本との時差を足す
DATEVALUE("2019/4/30")+TIMEVALUE("15:00:00")+TIME(9,0,0)
これがUTCで令和元年５月１日をかいたものになります。
+TIME(9,0,0)
ここで日本のPCのシステムの日時であるJST、つまりUTCに9時間足したものが令和です。

###ExcelがTimeZoneを考慮しないためセルに入力したTimeZoneを人間が理解する必要がある
####A2に入力した日時はどこのTimeZoneか
今回はUTCです
####日本との時差はどれくらいか
+09:00:00です
###以上を前提にする

```
=IF(A2+TIME(9,0,0)>=(DATEVALUE("2019/4/30")+TIMEVALUE("15:00:00")+TIME(9,0,0)),IF(YEAR(A2)=2019,TEXT(A2+TIME(9,0,0),"令和元年mm月dd日"),"令和"&TEXT(YEAR(A2)-2018,"00")&"年"&TEXT(MONTH(A2+TIME(9,0,0)),"00")&"月"&TEXT(DAY(A2+TIME(9,0,0)),"00")&"日"),TEXT(A2+TIME(9,0,0),"ggggee年mm月dd日"))
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126919/6fd37a00-755e-8a9a-ca40-de0fff5550dd.png)


###北京時間だったら
もしA2に入っているのが北京時間ならどうでしょう。
###北京時間はUTC+08:00
###システムロケールが日本なら
日本のシステムロケールUTC+09:00になっている
###ということは時差は1時間
####+Time(1,0,0)
北京時間ならUTCよりすでに8時間加算していますので、それを引くとTime(1,0,0)になります。
もしくは(1/24)*1です
なぜなら時間は単純に1を分割しているからです。


#結論から言うと暫定式で令和を使うのは無理
以上のようにExcelはTimeZoneという概念がありません。
そこで人間がシステムに設定されたTimezone（日本ならAsia/Tokyo UTC +09:00)を理解して、
さらにセルに入力した日時がJSTであることを理解して、
変換式を決める。
ということになります。
##結論から言うと不可能
つまりExcelの厄介なところは、入力している日時が何かわからない点です。サマータイムの時に示されていましたね。（下記参照）
ということはすでにサマータイムで悲鳴を上げた時に気付くべきだったのですが、国際的にデータをやり取りするときはUTCに置き換える必要が常に発生します。
すると令和と平成が同居する4月30日が発生します。
前も言ったようにすでに元号は使ってはいけません。
使うとシステムが崩壊します。
この暫定の技術も文字列に変わる欠点があります。そうすると日付として計算ができない。




[『Excelにタイムゾーンという概念がなく、サマータイムに対応しないということは』『これから未来永劫、時限サマータイムの2年間についての複雑な特別処理を仕込まないと、正しい集計ができなくなります』- Togetter］(https://togetter.com/li/1256548)

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">日本以外の先進国はみんなサマータイムを採用してると推進派はよく言います。私見では、これは欧米文化の汚点です。<br>そもそも時計というのは、我々の生きる時空連続体の時間次元を計るものです。<br>時間が未来にしか進まない以上、サマータイムのように離散的に時計を巻き戻すのは、人間知性の敗北です。</p>&mdash; 須藤玲司 (@LazyWorkz) <a href="https://twitter.com/LazyWorkz/status/1028071129636728832?ref_src=twsrc%5Etfw">2018年8月11日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Excelにはタイムゾーンがないんです。<br>日時は、1900/1/1 0:0:0を1.00とする小数で持っているだけ。(しかも1900/2/29が存在する) <a href="https://t.co/5PzGGVWde6">https://t.co/5PzGGVWde6</a><br><br>なのでタイムゾーンの処理が必要なときは、例えば+9時間をハードコーディングすることになります (ToT;</p>&mdash; 山本康彦＠BluewaterSoft (@biac) <a href="https://twitter.com/biac/status/1028178159504506880?ref_src=twsrc%5Etfw">2018年8月11日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

.NET Framework における時差情報（サマータイム）の取り扱い
https://blogs.msdn.microsoft.com/nakama/2018/08/11/timezone/
>② DateTime 型の加減算処理を行う際は、必ず UTC を介して行う (p.35, 36)
.NET Framework 上で日付をプログラミングする際、DateTime 型でプログラミングされている方が多いと思いますが、DateTime 型はオフセット値（UTC からの時差）を持つことができません。DateTime 型は、***「見た目の数値」をそのまま加減算処理してしまうため、夏時間前後でのオフセット値の変化に対応できません***。このため、DateTime 型で加減算処理を行う場合には、必ず UTC を介して計算する必要があります。（ちなみにこの問題に対応するために導入されたのが DateTimeOffset 型です。）
アメリカでは国内に主に 4 つのタイムゾーンがある上に夏時間まであるため、プログラミングを行う際にタイムゾーンを考慮したプログラミングを行うのは当然なのですが、日本国内の場合、長らく単一のタイムゾーンしかなかったため、タイムゾーンを考慮した形で設計・実装・テストされているシステムは非常に少ないでしょう。正直なところ、今の状況で夏時間が導入された場合のことを考えると、日本の開発の実情を知る自分としてはかなりぞっとします。（「うちのシステムは夏時間が導入されても大丈夫です！」と言える国内開発者はどれだけいるのだろうかと．．．．；）

MSAccess - Timestamp - Universal Time?
https://stackoverflow.com/questions/18277554/msaccess-timestamp-universal-time

現在のタイムゾーンを取得する: Win32_TimeZone - WMI Sample (VB)
http://www.wmifun.net/sample/vb6/win32_timezone.html
タイムゾーン呪いの書
https://qiita.com/dmikurube/items/15899ec9de643e91497c

VBA／マクロ便利Tips：
Excelにおける時間の計算や変換に役立つ6つの関数――TimeValue、TimeSerial、Hour、Minute、Second、Timerの使い方
https://www.atmarkit.co.jp/ait/articles/1506/04/news164.html

エクセルでUTCロンドン時間をJST日本時間に直す方法
https://teratail.com/questions/108457
こちらは+Time(9,0,0)ではなく(1/24)*9を使用している例

Excel(エクセル)基本講座：日付の関数
http://www.eurus.dti.ne.jp/~yoneyama/Excel/kansu/today.htm
=DATESTRING(日付のシリアル値)は日本のExcel版にしか存在しない関数