質問: ### 前提・実現したいこと PHPのCarbonライブラリを使用して和暦表示を行おうとしたのですが、後述のコードでは何故か西暦が表示されてしまいます。 何かご存知の方がいらっしゃれば、ご連絡いただけないでしょうか。 参考:https://qiita.com/m0r1/items/e6e9c70caa0aa44e1c4a ### 発生している問題・エラーメッセージ #### 期待する結果 ``` 平成31年 ``` #### 実際に出力される結果 ``` 2019年 ``` ### 該当のソースコード ``` use Carbon\Carbon; date_default_timezone_set('Asia/Tokyo'); setlocale(LC_TIME, 'ja_JP.utf8'); Carbon::now()->formatLocalized('%EC%Ey年'); ``` ### 補足情報(FW/ツールのバージョンなど) php 7.2(docker環境 image php:7.2-apache(debian:stretch相当)) Laravel 5.5
回答: Carbonの`formatLocalized()`は内部では結局PHPの`strftime()`を使っています。そしてPHPの`setlocale()`や`strftime()`は基本的にはシステムの用意しているCライブラリの対応した関数を呼び出しているだけなので、動作はシステムの環境に依存します。 `setlocale()`は成功しているか? ====================== `setlocale()`は失敗した場合に`false`を返します。 たとえば、ロケールのデータはかなり大きくなるのでデフォルトではインストールされていないことがあり、このようなときに失敗します。もしなければ追加する必要があります。 システムは`%EC`,`%Ey`で和暦表示に対応しているか ============================= 手元の環境で試してみましたが、以下のように対応状況はばらばらでした。お使いのシステムがどうなのか確認する必要があります | OS | ロケール指定 | `%EC`,`%Ey`の和暦表示 | | --- | --- | --- | | macOS Mojave 10.14.4 | ja_JP | × | | | ja_JP.UTF-8 | x | | CentOS 6.10 | ja_JP | ○(ただし文字コードがEUCになる) | | | ja_JP.UTF-8 | ○ | | Ubuntu 18.04.2 | ja_JP | × | | | ja_JP.UTF-8 | ○ | 和暦表示に対応していないシステムではこの目的には`formatLocalized()`は使えないということになります。PHPで独自に実装するなどする必要があるでしょう。