DateTime 使った、日付の確認スクリプトを作成したのですが、意図した月判定が出来ません。
現象は
- Ym や Y-m の判定のときのみ起こるようである。d を含むと正常(一般的な範囲の月判定)に動作する。
- 0 や 99 といった月判定されてはおかしいようなものが月判定される。
date
m 月。数字。先頭にゼロをつける。 01 から 12
マニュアルを見る限り、範囲外に思えるのですが、よく仕様を見落とすので、勘違いしている気がします。
どなたか、解説もらえないでしょうか。
よろしくお願いします。
php
1<?php 2 3$dates = [ 4 '2017028', 5 '201702', 6 '201720', 7 '20172008', 8 '2017208', 9 '201730', 10 '201740', 11 '201799', 12 '201700', 13 '20170', 14 '2017-02-8', 15 '2017-02', 16 '2017-20', 17 '2017-20-08', 18 '2017-20-8', 19 '2017-30', 20 '2017-40', 21 '2017-99', 22 '2017-00', 23 '2017-0', 24]; 25function chk_date($date) { 26 $formats = [ 27 'Ymd', 28 'Ym', 29 'Y-m-d', 30 'Y-m', 31 ]; 32 foreach ( $formats as $format ) { 33 DateTime::createFromFormat ( $format, $date ); 34 $result = DateTime::getLastErrors (); 35 36 if (! $result ['warning_count'] && ! $result ['error_count']) { 37 echo "<pre>"; 38 print_r(date_parse_from_format ( $format ,$date )); 39 echo "</pre>"; 40 return TRUE; 41 } 42 } 43 return FALSE; 44} 45 46foreach ( $dates as $date ) { 47 echo $date . ':'; 48 echo chk_date ( $date ) ? 'OK' : 'NG'; 49 echo '<br>'; 50} 51
2017028: Array ( [year] => 2017 [month] => 2 [day] => 8 [hour] => [minute] => [second] => [fraction] => [warning_count] => 0 [warnings] => Array ( ) [error_count] => 0 [errors] => Array ( ) [is_localtime] => ) OK 201702: Array ( [year] => 2017 [month] => 2 [day] => [hour] => [minute] => [second] => [fraction] => [warning_count] => 0 [warnings] => Array ( ) [error_count] => 0 [errors] => Array ( ) [is_localtime] => ) OK 201720: Array ( [year] => 2017 [month] => 20 [day] => [hour] => [minute] => [second] => [fraction] => [warning_count] => 0 [warnings] => Array ( ) [error_count] => 0 [errors] => Array ( ) [is_localtime] => ) OK 20172008:NG 2017208:NG 201730: Array ( [year] => 2017 [month] => 30 [day] => [hour] => [minute] => [second] => [fraction] => [warning_count] => 0 [warnings] => Array ( ) [error_count] => 0 [errors] => Array ( ) [is_localtime] => ) OK 201740: Array ( [year] => 2017 [month] => 40 [day] => [hour] => [minute] => [second] => [fraction] => [warning_count] => 0 [warnings] => Array ( ) [error_count] => 0 [errors] => Array ( ) [is_localtime] => ) OK 201799: Array ( [year] => 2017 [month] => 99 [day] => [hour] => [minute] => [second] => [fraction] => [warning_count] => 0 [warnings] => Array ( ) [error_count] => 0 [errors] => Array ( ) [is_localtime] => ) OK 201700: Array ( [year] => 2017 [month] => 0 [day] => [hour] => [minute] => [second] => [fraction] => [warning_count] => 0 [warnings] => Array ( ) [error_count] => 0 [errors] => Array ( ) [is_localtime] => ) OK 20170: Array ( [year] => 2017 [month] => 0 [day] => [hour] => [minute] => [second] => [fraction] => [warning_count] => 0 [warnings] => Array ( ) [error_count] => 0 [errors] => Array ( ) [is_localtime] => ) OK 2017-02-8: Array ( [year] => 2017 [month] => 2 [day] => 8 [hour] => [minute] => [second] => [fraction] => [warning_count] => 0 [warnings] => Array ( ) [error_count] => 0 [errors] => Array ( ) [is_localtime] => ) OK 2017-02: Array ( [year] => 2017 [month] => 2 [day] => [hour] => [minute] => [second] => [fraction] => [warning_count] => 0 [warnings] => Array ( ) [error_count] => 0 [errors] => Array ( ) [is_localtime] => ) OK 2017-20: Array ( [year] => 2017 [month] => 20 [day] => [hour] => [minute] => [second] => [fraction] => [warning_count] => 0 [warnings] => Array ( ) [error_count] => 0 [errors] => Array ( ) [is_localtime] => ) OK 2017-20-08:NG 2017-20-8:NG 2017-30: Array ( [year] => 2017 [month] => 30 [day] => [hour] => [minute] => [second] => [fraction] => [warning_count] => 0 [warnings] => Array ( ) [error_count] => 0 [errors] => Array ( ) [is_localtime] => ) OK 2017-40: Array ( [year] => 2017 [month] => 40 [day] => [hour] => [minute] => [second] => [fraction] => [warning_count] => 0 [warnings] => Array ( ) [error_count] => 0 [errors] => Array ( ) [is_localtime] => ) OK 2017-99: Array ( [year] => 2017 [month] => 99 [day] => [hour] => [minute] => [second] => [fraction] => [warning_count] => 0 [warnings] => Array ( ) [error_count] => 0 [errors] => Array ( ) [is_localtime] => ) OK 2017-00: Array ( [year] => 2017 [month] => 0 [day] => [hour] => [minute] => [second] => [fraction] => [warning_count] => 0 [warnings] => Array ( ) [error_count] => 0 [errors] => Array ( ) [is_localtime] => ) OK 2017-0: Array ( [year] => 2017 [month] => 0 [day] => [hour] => [minute] => [second] => [fraction] => [warning_count] => 0 [warnings] => Array ( ) [error_count] => 0 [errors] => Array ( ) [is_localtime] => ) OK
DateTime::createFromFormat を活かしたスクリプト
<?php $dates = [ '2017028', '201702', '201720', '20172008', '2017208', '201730', '201740', '201799', '201700', '20170', '2017-02-8', '2017-02', '2017-20', '2017-20-08', '2017-20-8', '2017-30', '2017-40', '2017-99', '2017-00', '2017-0', ]; function chk_date($date) { $formats = [ 'Ymd', 'Ym', 'Y-m-d', 'Y-m', ]; foreach ( $formats as $format ) { $datetime = DateTime::createFromFormat ( $format, $date ); $result = DateTime::getLastErrors (); if (! $result ['warning_count'] && ! $result ['error_count']) { echo ", format : $format <br>"; echo "DateTime : {$datetime->format('Y-m-d H:i:s')} <br>"; return TRUE; } } return FALSE; } foreach ( $dates as $date ) { echo "date : $date"; echo chk_date ( $date ) ? 'OK' : 'NG'; echo '<br><br>'; }
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/02/17 07:50
2017/02/17 08:41
退会済みユーザー
2017/02/17 09:48 編集