曜日とか年号とか、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のような値を返しますが、当関数では空文字を返します。