エス技研

WordPress、CakePHP、PHP、baserCMSなどの Web系システムを中心に情報を提供します!


WindowsのXAMPPのPHPではstrptimeは使用不可。代替はdate_parse_from_formatを使う

      2024/08/10

Windowsの PHPには strptimeは未実装。代替は date_parse_from_format

 
Linuxで動作していたシステムのメンテナンスを行うため、Windowsに XAMPP環境を構築し、そこで動作をさせてみました。
 
そうしたところ、「strptime()」でエラーが出ました。
エラーメッセージは、以下の通りでした。
 
Fatal error: Uncaught Error: Call to undefined function strptime() in C:\xampp\htdocs\test.php:999 Stack trace: #0 {main} thrown in C:\xampp\htdocs\test.php on line 999
 
「『strptime』はないよぅ」という内容です。
 
 
ちなみに、「strptime()」は、与えられた文字列が、指定した日時のフォーマットに沿っているか、その日時が存在する日時か、をチェックする関数です。
日時を引数として受け取る祭に、プログラム内で使用する前に正しい日時のフォーマットであることを確認するような場面で使用します。
 
 

PHPのマニュアルに Windowsの PHPに strptimeは未実装と書いてある

 
https://www.php.net/manual/ja/function.strptime.php
 
PHPの標準的なコマンドだと思っていましたが、いろいろ調べてみた結果、マニュアルにしっかりと書かれていました。
 

 
 
改めて、手元にある XAMPP環境で確認したところ、下記のいずれにも入っていませんでしたので、バージョンの問題でもないようです。
 PHP5.6.24
 PHP7.3.2
 PHP8.1.4
 
 
https://www.php.net/manual/ja/function.strptime.php
また、上記のマニュアルの最初の方に下記のように書いてあります。
 

 
つまりは、「まだ実装されていません」の「まだ」は、「まだ」と言いつつ、非推奨になることを期待して放置したのではないか、と疑問に感じるところです。
 
 

「strptime()」と「date_parse_from_format()」の違いと実装方法

 
それはさておき、Windows環境の XAMPPでは「strptime()」は使えませんので、代替の関数として用意されている「date_parse_from_format()」を使うとよさそうです。
https://www.php.net/manual/ja/function.date-parse-from-format.php
 
ただ、「strptime()」と「date_parse_from_format()」とでは少し挙動が異なりますので、単純に「strptime」を「date_parse_from_format」に置き換えるだけ、というわけにはいかないようです。
 
では、詳しく確認していきましょう。
 
 

「strptime()」と「date_parse_from_format()」の違い:実装の方法

 
「strptime()」と「date_parse_from_format()」を使用して、年月日が正しいかどうかをチェックする処理を行います。
 

 
 

「strptime()」と「date_parse_from_format()」の違い・引数の順番が違う

 
実装方法の 1つめの違いは、「strptime()」と「date_parse_from_format()」とで引数の、チェックする対象の変数と、日時のフォーマットの順番が逆になっています。
 
チェック対象の変数が、「strptime()」は第一引数なのに対し、「date_parse_from_format()」は第二引数になっています。
 
 

「strptime()」と「date_parse_from_format()」の違い・日時のフォーマットの指定形式が違う

 
実装方法の 2つ目の違いは、日時をチェックするためのフォーマットの指定形式が異なります。
 
2024-08-03」をチェックするにあたって、「strptime()」では「%Y-%m-%d」と指定しますが、「date_parse_from_format()」では「Y-m-d」となります。
 
 
各項目のフォーマットに関しては、下記の PHPのマニュアルを参照してください。
 
PHPマニュアル DateTimeImmutable::createFromFormat
https://www.php.net/manual/ja/datetimeimmutable.createfromformat.php
 
 

「strptime()」と「date_parse_from_format()」の違い:実行結果

 
「strptime()」と「date_parse_from_format()」とでは、実装方法も異なりますが、実行結果(レスポンス)も異なります。
 
前項のサンプルプログラムを実行した結果が下記になります。
 

 
年、月、日などの値が入っている配列のキー名称も異なりますが、値がない場合の結果の表記も異なります。
 
 

「strptime()」と「date_parse_from_format()」の違い・正しくない日時のレスポンスが全く違う

 

正しくない「2024-08-33」を日時として与えた場合

 
前項では、正しい年月日が入力された場合の処理ですが、ここでは、正しくない「2024-08-33」を日時として与えた場合の確認をしてみます。
 

 
 
以下が、上記の結果となります。
 

 
上記を確認すると明らかな違いがあります。
 
「strptime()」では「false」を返して終了です。
 
ですが、「date_parse_from_format()」は情報を返してくれます。
また、「'warning_count' => 1」「'warnings' => array(10 => 'The parsed date was invalid',)」のように、不具合がある内容を返してくれます。
 
 

正しくない「2024-a-03」を日時として与えた場合

 
次に、「2024-a-03」を入力した場合の結果を確認します。
 

 
「月」に「a」を入れていますので「'error_count' => 2」となり、エラー内容が返ってきています。
 
 
ちなみに「2024-08-33」の時のワーニングメッセージは「The parsed date was invalid」で「date」ですが、「2024-a-03」のエラーメッセージは「Unexpected data found.」で「data」ですね。
 
2024-08-33」は日時として認識できますが、「2024-a-03」は日時としては認識できません、ということかも知れないですね。
 
 

「strptime()」と「date_parse_from_format()」を使った日時チェックの記述方法

 
これまでの確認した内容から、「strptime()」と「date_parse_from_format()」を使用して、日付のフォーマットが正しいか否かをチェックする処理はそれぞれ下記のようになります。
 

 

 
「date_parse_from_format()」を使用する場合は、ワーニングとエラーの数が「0」である場合に「正しい」と判断する処理になりますね。
 
 
日時のフォーマットが正しくない場合「strptime()」では「false」になりますが、「date_parse_from_format()」ではフォーマットが正しい、正しくないに関わらずレスポンスはありますので、「date_parse_from_format()」では、レスポンスの有無で判定はできないということになります。
 
 

「strptime()」は環境によって挙動が異なる

 
「strptime()」についてさらなる追い討ちが!
 
https://www.php.net/manual/ja/function.strptime.php
「strptime()」については、マニュアルに下記のようにも書かれています。
 

 
https://qiita.com/YujiSoftware/items/1b65591efda79933fc79
上記の記事では挙動の違いを実際に試した結果を紹介してあります。
つまりは、「strptime()」は Linuxと Macで挙動が異なり、Windowsには実装されていない...ということになるわけです。
 
そんな関数は安心して使えないので、PHP8.1での非推奨勧告と関係なく、「date_parse_from_format()」を使う方がいいんでしょうね。

 - PHP・Smarty・ECCUBE

GoogleAdwords

GoogleAdwords

最後までお読みいただきましてありがとうございます。
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!

Message

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

下記の空欄を埋めてください。 * Time limit is exhausted. Please reload CAPTCHA.

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

※入力いただいたコメントは管理者の承認後に掲載されます。

  関連記事

cURLを利用する際の注意点「&」があるURLは「"」で囲む
cURLを利用する際の注意点「&」があるURLは「」で囲む

cURLでURLはダブルクォーテーションで囲む。LinuxでもWindowsでもコマンドでは「&」は意味を持つ文字のためエラー原因になる。クォーテーションは常につけておく方が無難。

ECCUBE2.13.3で商品規格の在庫数が無制限から変更できないバグがある

2.13.3固有のバグである商品規格の在庫数の入力エリアがアクティブにならない不具合を解消する解説です。product_class.tplの2行を修正するだけの簡単対応です。

PHP画面が真っ白 header(“Location: $url”);

PHPの開発で header(“Location: $url”);を使うと画面が真っ白になる不具合が出る場合もあります。

ECCUBEでカード決済NGの受注情報をマイページ購入履歴に表示しない方法解説

ECCUBEでカード決済に失敗しても購入履歴一覧に注文情報(受注情報)が表示される問題への対処方法を解説。受注情報レコードの作成の流れとステイタスについても解説。

include、requireのパス指定をdirname(__FILE__)、__DIR__と書く理由

include、requireのパスの指定を dirname(__FILE__)、__DIR__で記述する理由に付いて解説。相対パス、絶対パスを直書き、パスを書かない場合は何が問題かを説明。

ECCUBE mtb_constants initパラメータ設定の項目を追加する方法

ECCUBEのパラメータ設定で設定できる項目を追加する方法を説明します。

ECCUBEでテンプレートファイルのファイルサイズは10MB以下のものを使用してくださいのエラーが出た場合

テンプレートをアップロードする際にファイルサイズが大きすぎてエラーが表示される際の対処方法解説。パラメータ設定で設定する制限について解説を行っています。

複数銘柄を指定して株価チャートを一覧するツール公開

入力銘柄の5日間、3か月間、6か月間、1年間、2年間の株価チャートを一覧表示しますのでチャートで売買判断をするのに最適です。

PHPで正規表現の検証には preg_match_allが便利

PHPで正規表現の検証には preg_match_allが便利です。その便利さの使い方の解説です。

Smartyの修飾子regex_replaceで正規表現の後方参照・PHPではpreg_replace

ECCUBEで使われているSmartyで文字列を正規表現で置換し後方参照で値を利用する装飾子regex_replaceの解説です。細かな条件がありますので注意が必要です。