Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

PHP の strftime の文字長の制限

More than 5 years have passed since last update.

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"
ngyuki
テック系男子。 ただのやってみた系の記事ははてなブログに、それ以外の技術系のネタは Qiita に投稿します。
https://ngyuki.jp/
headjapan
中規模~大規模の安定した基幹システム・大規模サイトの分析・要件定義・設計・開発を得意とする、総合的な開発会社です。
http://www.headjapan.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away