エス技研

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.

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

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

  関連記事

Phpmailerでスパム回避!Gmail等のSMTPを経由するPHPのメールフォーム解説

お問い合わせ等のメールフォームから送ったメールがスパム扱いされる!その対策としてライブラリ「Phpmailer」を使う方法を解説。関数化していますのでコピペでOK。

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

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

数値がMySQLのint(11)に保存できない!PHPの変数が本当にint型か確認!
数値がMySQLのint(11)に保存できない!PHPの変数が本当にint型か確認!

PHPでintegerとdoubleが混在するような計算をする場合は要注意!計算結果が整数値であっても途中で使用する変数にdoubleの値が入っているときは計算結果がintegerではない場合があります。

指定した数で文字列を丸める関数substr、mb_substr、mb_strimwidthの違い
指定した数で文字列を丸める(n文字目で…にする)関数substr、mb_substr、mb_strimwidthの違い

文字列を指定された数で抜き出すPHPの関数、substr、mb_substr、mb_strimwidthについての解説。似た関数だが引数の指定方法が違ったり、文字数がバイト数か文字数かも違ったり、注意が必要だ。

PHPのスクレイピングライブラリ「PHP Simple HTML DOM Parser」の使い方
PHPのスクレイピングライブラリ「PHP Simple HTML DOM Parser」の使い方

PHPのスクレイピングライブラリ「PHP Simple HTML DOM Parser」の使い方を解説。要素を取得する方法、そこから属性を取得する方法を解説。また、マニュアルにはない注意点なども解説。

フォルダを指定してファイルのパーミッションを変更するプログラム

フォームからフォルダ、パーミッションを指定しパーミッションを変更するサンプルプログラムの解説です。

連想配列のキーも値もまとめてhtmlspecialchars()でサニタイズする関数の作成解説
連想配列のキーも値もまとめてhtmlspecialchars()でサニタイズする関数の作成解説

PHPの配列・連想配列のキーと値をまとめてhtmlspecialchars()関数でサニタイズ(無害化、無毒化)を行う関数を作成。連想配列のキーはarray_map()関数でのサニタイズは無理。

サーバ移転、PHPバージョンアップでPHPのソースコードが表示される・ショートタグのPHPが動かない

PHPでショートタグを使うのは危険。サーバ移転やバージョンアップで動かなくなる!ソースが丸見え、設定情報流出のリスクが!php.iniのshort_open_tagの設定を再確認。

PHPで月末から1ヶ月後「+1 month」を算出すると想定する日付にならない場合がある
PHPで月末から1ヶ月後「+1 month」を算出すると想定する日付にならない場合がある

PHPでは月末の1ヶ月後が想定した日付にならない場合がある。原因はバグではなくPHPの1ヶ月後の定義によるもの。なので必要とする日付を定義しそれに合わせてDateTime、modifyを使用して算出方法を解説している。

リダイレクトループが原因で「ERR_TOO_MANY_REDIRECTS」「このページを表示できません」が出たときの対策12事例+α

リダイレクトループ、自動転送設定ループの原因の解説とその対応方法を含め事例 12例を挙げて説明。