0
0

More than 3 years have passed since last update.

strftimeの日本語対応が少し面倒なので代替関数を作った

Last updated at Posted at 2020-03-08

曜日とか年号とか、strftimeで結果を日本語で表示したい場合、環境によって結果が異なる。ロケールの設定が必要とか、そもそも該当する設定ファイルがOSに同梱されてないことがあるとか、Cのライブラリが対応してないことがあるとかです。

strftimeとパラメータ互換で使える代替関数を作りました。同じようなものを作っている人がたくさんいるのは知ってますが、これくらいならコピペで済ませず自作したい。

function datetime_format($format, $timestamp='0000-00-00 00:00', $default='') {
    if(!$timestamp || strpos($timestamp, '0000-00-00')===0) {
        // 値がない場合は空文字列を返す
        return $default;
    }
    if(!preg_match('@^[0-9]+$@', $timestamp)) {
        // 文字列の場合はUNIXタイムスタンプ形式に変換
        $timestamp = strtotime($timestamp);
    }
    if(strpos($format,'%')===false) {
        // strftime関数の変換指定子がない場合はdate関数で処理して返す
        return date($format, $timestamp);
    }
    if(strpos($format, '%曜')!==false) {
        // 日本語の曜日処理はここで
        $week = ['日', '月', '火', '水', '木', '金', '土'];
        $format = str_replace('%曜', $week[date('w', $timestamp)], $format);
    }
    if(strpos($format, '%E')!==false) {
        // 和暦処理
        $E = function($timestamp) {
            $ymd = date('Ymd', $timestamp);
            $Y = date('Y', $timestamp);
            if (20190501 <= $ymd) {
                return array('令和', ($Y - 2018));
            }
            if (19890108 <= $ymd) {
                return array('平成', ($Y - 1988));
            }
            if (19261225 <= $ymd) {
                return array('昭和', ($Y - 1925));
            }
            if (19120730 <= $ymd) {
                return array('大正', ($Y - 1911));
            }
            return array('明治', $Y-1868);
        };
        $format = str_replace(
            array('%EC', '%Ey'), $E($timestamp), $format
        );
    }
    return strftime($format, $timestamp);
}

実用上の問題がなければいいと思って、明治よりも前の判定は作ってません。これ以上を求めるならCarbonを使うのがいいと思います。

echo datetime_format('%EC%Ey年%m月%d日(%曜)', '2020-03-09'); // 令和2年3月9日(月)

元号や日本語の曜日が不要な場合は、$format はstrftime方式・date方式どちらでもokです。 % 文字を含むかどうかで判定します。$timestamp はunixタイムスタンプ・日付文字列どちらでもokです。
空の値を与えた場合はstrftime関数もdate関数も1970-01-01のような値を返しますが、当関数では空文字を返します。

0
0
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
0
0