gallu’s blog

エンジニアでゲーマーで講師で占い師なおいちゃんのブログです。

date_parseにおける「日付フォーマットにエラーがある場合」とは?

んと…大分前に嵌ったのですが。
「日付のvalidateをどうすんべ」ってのが発端でございました。


例えば

  $s = 'yyyymmdd';

という文字列をdate_parseすればエラーなのは当然でございます。
まぁ…
http://php.benscom.com/manual/ja/function.date-parse.php

返り値
成功した場合に日付情報を含む配列、 失敗した場合に FALSE を返します。

を一瞬読み間違えると

  $s = 'yyyymmdd';
  $ret = date_parse($s);
  if (false === $ret) {
    // エラー処理
  }

と書いてそれなりに痛い目にあうのですが orz


上述における「失敗した場合」というのは「パース結果が異常である」ではなくて「パース処理そのものが何らかの事情でこけた」です。
おいといて。


んじゃまぁってんで読み進めますと

日付フォーマットにエラーがある場合は、 'errors' 要素にエラーメッセージが格納されます。

とか書いてあります。

  $s = 'yyyymmdd';
  $ret = date_parse($s);
var_dump($ret);

で確かめてみますと、確かに

["warning_count"]=>
int(1)
["warnings"]=>
array(1) {
[6]=>
string(29) "Double timezone specification"
}
["error_count"]=>
int(1)
["errors"]=>
array(1) {
[0]=>
string(47) "The timezone could not be found in the database"
}

となっておりますふむり。
error_count使ってもよござんしょうし、errorsがどうなっているかをチェックしてもよござんしょうし。
よっしゃ日付のvalidateはこれでばっち「ぐ〜*1」とか考えると大きな落とし穴にはまります。

  $s = '99999999';
  $ret = date_parse($s);
var_dump($ret);

こんなコードで試してみましょう。

["warning_count"]=>
int(0)
["warnings"]=>
array(0) {
}
["error_count"]=>
int(0)
["errors"]=>
array(0) {
}

………まてこら。なんていうか…多分全国幾多のプログラマの予想とは反してるんじゃないかと思うのですが如何でしょうか?
ちなみに。validateをチェックする時に、本当の本当に見るべき場所は、ここ。

["year"]=>
int(9999)
["month"]=>
bool(false)
["day"]=>
bool(false)
["hour"]=>
bool(false)
["minute"]=>
bool(false)
["second"]=>
bool(false)

んと…「日付だけの時と日時の時とでチェックする場所が当然変わる」のですが、この辺をis_boolあたりで丹念にチェックする必要があります。


以前に、無駄に一瞬嵌ったので、思い出しつつめもり。
…相変わらずきしょい仕様だ orz

*1: (C)えどはるみ