あまり知られていないとおもいますが、実は PHP でも元号を使って日付を表示することができます。表示可能なのは明治 6 年以降でそれ以前は "西暦" と表示されます。
明治 6 年というとずいぶん中途半端な感じがしますが、Wikipedia1 によるとこの年に新暦となり、旧暦(天保暦)から新暦(グレゴリオ暦) に変更されていて、西暦の日付と和暦の日付が一致するようになったからだと思います。
なお今回例示用に利用した環境は以下の通りです。
さて、本題です。いきなりいくつかの実行例をみていただきましょう。
ポイントは setlocale()2 関数でロケールを日本に設定して、strftime()3 関数で書式指定して出力しています。その時に書式指定として "%E" 修飾子を追加することで和暦の年号が出力されています。
"%E" はロケールに依存した別表記と定義されているので、日本では元号が表示されるという仕組みです。
さていくつかの境界事例を見てみましょう。strftime() 関数は、日付時刻の指定に UNIX タイムを利用するので、ここでは mktime()4 関数を利用しています。
明治 6 年 (1873) 以前と以後
明治から大正への改元は 1912 年 7 月 30 日5
大正から昭和への改元は 1926 年 12 月 25 日6
昭和から平成への改元は 1989 年 1 月 8 日。7 急に学校が休みになってびっくりした記憶があります。
ついでにほとんど利用することは無いと思いますが、紀元前と紀元後
おや変ですね。mktime() のマニュアル8 を参照すると以下の記載があります。
2 桁または 4 桁の値を指定可能で、 0-69 の間の値は 2000-2069 に、70-100 は 1970-2000 にマップされます。
おっと、うっかりしていました。ということは、0-100 年は mktime() が使用できません。代わりに date_create_from_format()9 と date_format()10 関数を利用してみます。
ちゃんと表示されましたね。
さて気になる新元号「令和」への対応ですが、strftime() は glibc が持っているロケールデータを利用しているので、glibc での対応待ちとなります。glibc では、アップストリームの git に追加データのコミットが 2019/4/2 にされていますので、間もなく各ディストリビューションからアップデートがリリースされると思います。
そこで注意してほしいのは php そのものではなく glibc もしくは ロケールデータの更新となることに注意してください。