回答編集履歴

2

サンプルコードの結果を追記

2017/09/24 07:34

投稿

miyahan
miyahan

スコア3095

test CHANGED
@@ -80,7 +80,7 @@
80
80
 
81
81
  if ($date === false) {
82
82
 
83
- throw new InvalidArgumentException('日付をパースきませんでした!!');
83
+ throw new InvalidArgumentException('日付が不正!!');
84
84
 
85
85
  }
86
86
 
@@ -96,4 +96,20 @@
96
96
 
97
97
  print('自然言語スタイル: '. parseDate($date_str)->format('Y/n/j') . PHP_EOL);
98
98
 
99
+
100
+
101
+ // SQLスタイル: 2017-09-24
102
+
103
+ // 自然言語スタイル: 2017/9/24
104
+
105
+
106
+
107
+ $date_str = '2017年09月240000000000日(日)';
108
+
109
+ print('SQLスタイル: '. parseDate($date_str)->format('Y-m-d') . PHP_EOL);
110
+
111
+
112
+
113
+ // Fatal error: Uncaught InvalidArgumentException: 日付が不正です!! in ...
114
+
99
115
  ```

1

誤り修正・サンプルコードを追加

2017/09/24 07:33

投稿

miyahan
miyahan

スコア3095

test CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
 
4
4
 
5
- で、format() に失敗するということは、その前の DateTime::createFromFormat() が失敗して null が返ってきているためだと思われます。
5
+ で、format() に失敗するということは、その前の DateTime::createFromFormat() が失敗して false が返ってきているためだと思われます。
6
6
 
7
7
 
8
8
 
@@ -26,7 +26,7 @@
26
26
 
27
27
 
28
28
 
29
- こちらで上記のコードを試したところエラー無く動いたので、postFilterFormat() が何か意図しない結果を返しているのだと思います。確認してみてください。
29
+ こちらで上記のコードを試したところエラー無く動いたので、postFilterFormat() とやらが意図しない結果を返しているのだと思います。確認してみてください。
30
30
 
31
31
 
32
32
 
@@ -34,7 +34,7 @@
34
34
 
35
35
 
36
36
 
37
- ちなみに DateTime の書式に、以後の文字を無視する `+` というオプションがあります。これを使うと曜日の部分: `(日)` を自分で除去しなくてもそのままパースすることができます。お試し下さい。
37
+ ちなみに DateTime::createFromFormat の書式に、以後の文字を無視する `+` という表記があります。これを使うと曜日の部分: `(日)` を自分で除去しなくてもそのままパースすることができます。お試し下さい。
38
38
 
39
39
 
40
40
 
@@ -59,3 +59,41 @@
59
59
 
60
60
 
61
61
  参考:[PHP: DateTime::createFromFormat - Manual](http://php.net/manual/ja/datetime.createfromformat.php)
62
+
63
+
64
+
65
+ また、できればその関数は DateTime オブジェクトに変換するところまでを行い、DateTime オブジェクトから日付・時刻の文字列に format() するのはデータを実際に使うタイミング(データベースに入れるとき、printするとき等)にしたほうが汎用性が上がると思います。
66
+
67
+
68
+
69
+ さらに今回のようにエラーに気づかずにトラブルにならないよう、日付がパースできなかったら例外を投げるようにすると安全性と信頼性が高まります。
70
+
71
+
72
+
73
+ ```php
74
+
75
+ function parseDate($date_str)
76
+
77
+ {
78
+
79
+ $date = DateTime::createFromFormat('Y年m月d日+', $date_str);
80
+
81
+ if ($date === false) {
82
+
83
+ throw new InvalidArgumentException('日付をパースできませんでした!!');
84
+
85
+ }
86
+
87
+ return $date;
88
+
89
+ }
90
+
91
+
92
+
93
+ $date_str = '2017年09月24日(日)';
94
+
95
+ print('SQLスタイル: '. parseDate($date_str)->format('Y-m-d') . PHP_EOL);
96
+
97
+ print('自然言語スタイル: '. parseDate($date_str)->format('Y/n/j') . PHP_EOL);
98
+
99
+ ```