LoginSignup
3
3

More than 5 years have passed since last update.

PHP の strftime の文字長の制限

Last updated at Posted at 2014-10-22

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"
3
3
2

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