質問編集履歴

3 修正

te2ji

te2ji score 14262

2017/02/17 16:52  投稿

DateTime クラスの月判定に関して
DateTime 使った、日付の確認スクリプトを作成したのですが、意図した月判定が出来ません。
現象は
- Ym や Y-m の判定のときのみ起こるようである。d を含むと正常(一般的な範囲の月判定)に動作する。
- 0 や 99 といった月判定されてはおかしいようなものが月判定される。
[date](http://php.net/manual/ja/function.date.php)
m   月。数字。先頭にゼロをつける。   01 から 12
マニュアルを見る限り、範囲外に思えるのですが、よく仕様を見落とすので、勘違いしている気がします。
どなたか、解説もらえないでしょうか。
よろしくお願いします。
```php
<?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::createFromFormat ( $format, $date );
       $result = DateTime::getLastErrors ();
       if (! $result ['warning_count'] && ! $result ['error_count']) {
       echo "<pre>";
       print_r(date_parse_from_format ( $format ,$date ));
       echo "</pre>";
           return TRUE;
       }
   }
   return FALSE;
}
foreach ( $dates as $date ) {
   echo $date . ':';
   echo chk_date ( $date ) ? 'OK' : 'NG';
   echo '<br>';
}
```
```
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>';  
}  
```
  • PHP

    24069 questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • DateTime

    67 questions

    多くのプログラミング言語におけるDateTimeオブジェクトは、日付と時間に関する演算と出力を行います。

2 追記修正

te2ji

te2ji score 14262

2017/02/17 10:12  投稿

DateTime クラスの月判定に関して
DateTime 使った、日付の確認スクリプトを作成したのですが、意図した月判定が出来ません。
現象は
・Ym の判定のときのみ起こるようである。
・0 や 99 といった月判定されてはおかしいようなものが月判定される。
・d を含むと正常(一般的な範囲の月判定)に動作する。
- Ym や Y-m の判定のときのみ起こるようである。d を含むと正常(一般的な範囲の月判定)に動作する。
- 0 や 99 といった月判定されてはおかしいようなものが月判定される。
[date](http://php.net/manual/ja/function.date.php)
m   月。数字。先頭にゼロをつける。   01 から 12
マニュアルを見る限り、範囲外に思えるのですが、よく仕様を見落とすので、勘違いしている気がします。
どなたか、解説もらえないでしょうか。
よろしくお願いします。
```php
<?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::createFromFormat ( $format, $date );
       $result = DateTime::getLastErrors ();
       if (! $result ['warning_count'] && ! $result ['error_count']) {
       echo "<pre>";
       print_r(date_parse_from_format ( $format ,$date ));
       echo "</pre>";
           return TRUE;
       }
   }
   return FALSE;
}
foreach ( $dates as $date ) {
   echo $date . ':';
   echo chk_date ( $date ) ? 'OK' : 'NG';
   echo '<br>';
}
 
```
```
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  
```
  • PHP

    24069 questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • DateTime

    67 questions

    多くのプログラミング言語におけるDateTimeオブジェクトは、日付と時間に関する演算と出力を行います。

1 修正

te2ji

te2ji score 14262

2017/02/17 09:23  投稿

DateTime 関数の月判定に関して
DateTime クラスの月判定に関して
DateTime 使った、日付の確認スクリプトを作成したのですが、意図した月判定が出来ません。
現象は
・Ym の判定のときのみ起こるようである。
・0 や 99 といった月判定されてはおかしいようなものが月判定される。
・d を含むと正常(一般的な範囲の月判定)に動作する。
[date](http://php.net/manual/ja/function.date.php)
m 月。数字。先頭にゼロをつける。 01 から 12
マニュアルを見る限り、範囲外に思えるのですが、よく仕様を見落とすので、勘違いしている気がします。
どなたか、解説もらえないでしょうか。
よろしくお願いします。
```php
<?php
$dates = [
'2017028',
'201702',
'201720',
'20172008',
'2017208',
'201730',
'201740',
'201799',
'201700',
'20170',
];
function chk_date($date) {
$formats = [
'Ymd',
'Ym',
];
foreach ( $formats as $format ) {
DateTime::createFromFormat ( $format, $date );
$result = DateTime::getLastErrors ();
if (! $result ['warning_count'] && ! $result ['error_count']) {
echo "<pre>";
print_r(date_parse_from_format ( $format ,$date ));
echo "</pre>";
return TRUE;
}
}
return FALSE;
}
foreach ( $dates as $date ) {
echo $date . ':';
echo chk_date ( $date ) ? 'OK' : 'NG';
echo '<br>';
}
```
```
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
```
  • PHP

    24069 questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • DateTime

    67 questions

    多くのプログラミング言語におけるDateTimeオブジェクトは、日付と時間に関する演算と出力を行います。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る