format()
という関数が見つからないというエラーなので、エラーが出ている行はそこではなく、$result = $format_date->format('Y-m-d');
だと思います。
で、format() に失敗するということは、その前の DateTime::createFromFormat() が失敗して false が返ってきているためだと思われます。
php
1$date = '2017年09月24日(日)';
2$no_week = mb_substr($date, 0 ,-3, "utf-8");// 曜日を切り離す
3$format_date = DateTime::createFromFormat('Y年m月d日', $no_week);
4$result = $format_date->format('Y-m-d');
5print($result. PHP_EOL);
6
7// 2017-09-24
こちらで上記のコードを試したところエラー無く動いたので、postFilterFormat() とやらが意図しない結果を返しているのだと思います。確認してみてください。
ちなみに DateTime::createFromFormat の書式に、以後の文字を無視する +
という表記があります。これを使うと曜日の部分: (日)
を自分で除去しなくてもそのままパースすることができます。お試し下さい。
php
1function formatDate($date_str)
2{
3 $date = DateTime::createFromFormat('Y年m月d日+', $date_str);
4 return $date->format('Y-m-d');
5}
6
7print(formatDate('2017年09月24日(日)') . PHP_EOL);
参考:PHP: DateTime::createFromFormat - Manual
また、できればその関数は DateTime オブジェクトに変換するところまでを行い、DateTime オブジェクトから日付・時刻の文字列に format() するのはデータを実際に使うタイミング(データベースに入れるとき、printするとき等)にしたほうが汎用性が上がると思います。
さらに今回のようにエラーに気づかずにトラブルにならないよう、日付がパースできなかったら例外を投げるようにすると安全性と信頼性が高まります。
php
1function parseDate($date_str)
2{
3 $date = DateTime::createFromFormat('Y年m月d日+', $date_str);
4 if ($date === false) {
5 throw new InvalidArgumentException('日付が不正です!!');
6 }
7 return $date;
8}
9
10$date_str = '2017年09月24日(日)';
11print('SQLスタイル: '. parseDate($date_str)->format('Y-m-d') . PHP_EOL);
12print('自然言語スタイル: '. parseDate($date_str)->format('Y/n/j') . PHP_EOL);
13
14// SQLスタイル: 2017-09-24
15// 自然言語スタイル: 2017/9/24
16
17$date_str = '2017年09月240000000000日(日)';
18print('SQLスタイル: '. parseDate($date_str)->format('Y-m-d') . PHP_EOL);
19
20// Fatal error: Uncaught InvalidArgumentException: 日付が不正です!! in ...
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/09/24 09:40
2017/09/24 09:47
2017/09/24 09:56