PHP公式ライブラリを使って、「令和(和暦)」の日付を表現する方法

reiwa-small システム開発

PHP公式ライブラリを使って、「令和」の日付を表現する方法

日付を出力する時、「令和4年11月16日」といった和暦で出力する時、PHPの標準ライブラリの IntlDateFormatter を使う事が出来ます。
(ただし、いくつか条件が揃っていなければ、「令和4年」でなく「平成34年」といった出力になります。詳しくは後述します)

(公式)
PHP: IntlDateFormatter – Manual
PHP: IntlDateFormatter::create – Manual

具体的には、こんな感じです。

use IntlDateFormatter;
use DateTime;

//(中略)

        japaneseDateFormatter = new   (
            'ja_JP@calendar=japanese',
            IntlDateFormatter::LONG,
            IntlDateFormatter::NONE,
            'Asia/Tokyo',
            IntlDateFormatter::TRADITIONAL
        );currentDate = japaneseDateFormatter->format(new DateTime()) ?: '';

        echocurrentDate . PHP_EOL;

出力結果

令和4年11月21日

ただ、公式マニュアル見ても、引数の説明がやや不親切で、ちょっと分かりづらいのが難点。

以下、公式の内容。

public IntlDateFormatter::__construct(
    ?string locale,
    intdateType = IntlDateFormatter::FULL,
    int timeType = IntlDateFormatter::FULL,
    IntlTimeZone|DateTimeZone|string|nulltimezone = null,
    IntlCalendar|int|null calendar = null,
    ?stringpattern = null
)

$locale」には、どんな値を設定すればいいの?
$dateType」には、どんな値を設定すればいいの?
 といった事が分かりづらいので、調べた内容を書いておきます。

第1引数: $locale

どんな引数を使えばいいの? 調べていると、最終的に以下のサイトに行き着く。
(PHP公式マニュアルが、以下のサイトへのリンクを貼ってある)

ICU Demonstration – Locale Explorer

が、「ja_JP」や「calendar=japanese」という表記は特に無し。

一方で「’de-DE’」といった値を設定している例が公式のサンプルにも存在していたりと、何だかカオス。

指定しなかった(nullをしていた)場合、php.ini の「intl.default_locale」の値を参照するらしいが、intl.default_locale の設定例が「en_utf8」「ja_JP.UTF-8」「fr」といった情報が見つかったりと、輪をかけて良く分からない。

結局、「IntlDateFormatter 令和」とかでググって出てきたサイトを参考に設定したけど、みんなどうやって一次情報に辿り着いたのだろう。

第2引数: $dateType

設定できる値は、以下に紹介されています。
https://www.php.net/manual/ja/class.intldateformatter.php#intl.intldateformatter-constants

ただ、これだけだと何の事やらさっぱり分からないので、表示内容を書いてみました。

$dateType の値 出力例
IntlDateFormatter::NONE (何も出力されない)
IntlDateFormatter::SHORT 00041121
IntlDateFormatter::MEDIUM R4/11/21
IntlDateFormatter::LONG 令和4年11月21日
IntlDateFormatter::FULL 令和4年11月21日月曜日

第3引数: $timeType

設定できる値は、「$dateType」と同様です。
こちらもマニュアルからは具体的な表示内容が分からないので、書いてみました。

$timeType の値 出力例
IntlDateFormatter::NONE (何も出力されない)
IntlDateFormatter::SHORT 1:04
IntlDateFormatter::MEDIUM 1:04:44
IntlDateFormatter::LONG 1:05:00 JST
IntlDateFormatter::FULL 1時05分16秒 日本標準時

第4引数: $timezone

具体的に入力する内容は、こちらを参照。
https://www.php.net/manual/timezones.php

エンジニアにとっては馴染みの深い、’Asia/Tokyo’ とか ‘UTC’ といった値。

ちなみに、$timezone を ‘UTC’ に設定し、$timeType を「IntlDateFormatter::FULL」に設定して出力すると、「16時09分14秒 協定世界時」といった表示になります。

‘America/Los_Angeles’ なら「アメリカ太平洋標準時」です。

第5引数: $pattern

「このサイトを参照してください」と紹介されたのが以下のリンクのページだけど、見てもさっぱり分かんねーよ!
https://unicode-org.github.io/icu/userguide/format_parse/datetime/

という事で、具体的に設定する値と出力例

$pattern の値 出力例
IntlDateFormatter::TRADITIONAL 令和4年11月20日
IntlDateFormatter::GREGORIAN 西暦2022年11月20日

ライブラリのインストール

「intl」というライブラリをインストールする必要があります。
また、intl は libicu-dev との依存関係があるので、こちらもインストールする必要があります。

Dockerfile:記述例

FROM php:8.1.12-fpm

# 中略

RUN apt-get update && apt-get install -y \
     git \
     iputils-ping \
     net-tools \
     zlib1g-dev \
     libicu-dev \
     unzip \
     libzip-dev \
     libfreetype6-dev libjpeg62-turbo-dev libmcrypt-dev libaio1 \
  && docker-php-ext-install gd zip intl

Amazon Linux へのインストール・インストールチェック

sudo yum install -y libicu-devel
sudo yum install -y php-intl

正常にインストールが確認されているか確認するコマンドは以下です。

$ php -m | grep intl

「intl」と表示されていれば、インストールは成功です。

ちなみに「libicu」は php のライブラリではなく、Linux にインストールされるライブラリのため、「php -m」コマンドで検出できません。

「libicu」は、以下のコマンドでインストール確認できます。

$ yum list | grep libicu
libicu.x86_64                          50.2-4.amzn2                   installed

こんな感じで「libicu」が「installed」となっている事を確認できます。

どうでもいいけど、「intl」は多分「international」の事。

IntlDateFormatter(intl)を使うための条件

上記の設定を適用しても、Docker イメージによっては、「令和4年」と出力されず、「平成34年」と出力されました。

どうやら、コンテナで使用している Linux のバージョンによって差があるみたいです。
Linux のバージョンについては、「cat /etc/issue」コマンドにて確認しました。

正常に出力できたコンテナイメージ(「令和4年」と出力されたイメージ)

php:8.0-fpm

root@6e598c5bed70:/var/www/src# cat /etc/issue
Debian GNU/Linux 11 \n \l

php:8.1.12-fpm

root@0663deba958b:/var/www/src# cat /etc/issue
Debian GNU/Linux 11 \n \l

正常に出力できなかったコンテナイメージ(「平成34年」と出力されたイメージ)

php:7.4.11-fpm

root@1fb705e4c768:/var/www/html/my-laravel-app# cat /etc/issue
Debian GNU/Linux 10 \n \l

php:8.1-fpm-buster

root@a6f73fb248da:/var/www/src# cat /etc/issue
Debian GNU/Linux 10 \n \l

PHP のバージョンの差かと思いきや、Linux のバージョンの差とは意外でした。

ちなみに「php:8.1-fpm-buster」の “buster” は Debian のコードネームなので Debian ベースのイメージと判断できるのですが、凄まじく分かりづらいので、コンテナイメージの名前の付け方は、もう少しどうにかならないものかとずっと思っています。

というか “buster” が付いていない他のイメージも全部 Debian だし。

正常に出力できた Amazon Linux マシン

EC2上で動作させたマシンを使用したところ、無事、正常に出力できた事を確認しました。
バージョンは、こんな感じです。

$ cat /etc/system-release
Amazon Linux release 2 (Karoo)

コメント

タイトルとURLをコピーしました