strftime
は 1024 文字以上になると失敗します。
var_dump(strftime(str_repeat("x", 1023), time())); // "xxx..."
var_dump(strftime(str_repeat("x", 1024), time())); // false
この制限は、引数の文字数ではなく 結果の文字数 です。
var_dump(strftime("%F" . str_repeat("x", 1013), time())); // "2014-10-22xxx..."
var_dump(strftime("%F" . str_repeat("x", 1014), time())); // false
PHP 5.5 以降なら 4095 文字まで大丈夫です。
var_dump(PHP_VERSION); // "5.5.18"
var_dump(strftime(str_repeat("x", 4095), time())); // "xxx..."
var_dump(strftime(str_repeat("x", 4096), time())); // false
var_dump(strftime("%F" . str_repeat("x", 4085), time())); // "2014-10-22xxx..."
var_dump(strftime("%F" . str_repeat("x", 4086), time())); // false
どうしても(PHP が許容できる)任意の文字長に対応する必要があるなら、次のように preg_replace_callback
を使うとよいでしょう。
function strftime_long($format, $time)
{
return preg_replace_callback('/%(?:%|\w+)/', function ($m) use ($time) {
$s = $m[0];
return strftime(substr($s, 0, 32), $time) . substr($s, 32);
}, $format);
}
var_dump(strftime_long(str_repeat("x", 10000), time())); // "xxx..."
var_dump(strftime_long("%F%%%T" . str_repeat("x", 10000), time())); // "2014-10-22%19:26:00xxx..."
var_dump(strftime_long("%EcX", time())); // "Wed Oct 22 19:26:00 2014X"