PHP

strftime関数の変換指定子が プラットフォームによって微妙に違う件について

あるとき、smartyのdate_formatにおいて月をあらわす数値の最初のゼロを表示させない方法をググって見つけました。

仙人の心得 ≫ date_format

そのとおりにやってみましたが、うまくいきません。しかし、以前は別の環境でうまくいってました。その原因と解決策について。

【date_format参考】
date_format

smartyのdate_format修正子はPHPのstrftime関数に依存しています。
ということで、まずあなたのPHP環境で下記のコードを実行してみてください。

echo strftime('%-m', mktime(0,0,0,1,1));

何が表示されましたか?人によっては「01」だったり「1」だったりするでしょう。その原因は実行するプラットフォームに影響されることが分かりました。たしかに以前はLinux環境でやっていたのです。

PHP: strftime – Manual

PHPのマニュアルを良く見てみると、上の方に

Windwos システム上でサポートされる変換指定子の概要については、 ≫ MSDN に掲載されています。

なんて書いてあります。どうやら、WindowsとUNIXではstrftimeの挙動がそれぞれのライブラリに依存しているらしいのです。まぁ、リンク先のMSDNの英語ページを読み解くのも堅苦しいので、日本語ページをご覧ください。

strftime、wcsftime (CRT)

下の方に書いてありますね。

%#d, %#H, %#I, %#j, %#m, %#M, %#S, %#U, %#w, %#W, %#y, %#Y 先行ゼロがあれば削除されます。

じゃあこれに習って下記のコードを実行してみてください。

echo strftime('%#m', mktime(0,0,0,1,1));

きっとさっき「01」と表示されてしまった人は今度は「1」となったことでしょう。逆に先ほど「1」されていた人は「01」になったと思います。

ということです。やり方はわかりましたが、ここは是非両方に対応させたいですね。こうやってはどうか!?

echo strftime('%-#m', mktime(0,0,0,1,1));

うちのLinux環境ではうまくいきましたが、Windowsでは。。。

#m.

はい、どうみても失敗です。ありがとうございました。
どなたか解決策あったら教えてください(´・ω・`)

<11/25 追記>
Smartyでは少々の修正で統一できるようです。
pluginsディレクトリ内にあるmodifer.date_format.phpのファイルのソースの一部に%-mに関する追記をします。
具体的には下記の通り。追記箇所は見れば分かると思います。

$_win_from = array('%D',       '%h', '%n', '%r',          '%R',    '%t', '%T',       '%-m');
$_win_to   = array('%m/%d/%y', '%b', "\n", '%I:%M:%S %p', '%H:%M', "\t", '%H:%M:%S', '%#m');

$_win_from%-mを追加し、$_win_to%#mを追加しました。
この部分ではWindowsの場合はUNIX式に置換する修飾子を設定しています。
なんで差異があればここで埋めてしまえばよいということですね。
これでプラットフォームに左右されず%-mで統一できます。

スポンサーリンク
記事を書いた人

システムえんじにゃー🐈
趣味はエレキギター、自転車など。作曲したい。
World of Warshipsやってます。
記事に関する質問はお気軽にどうぞ。

surface0 (さーふぇす)をフォローする

コメント

タイトルとURLをコピーしました