2

率直に言って、私は困惑しています。このコードで失敗メッセージが表示される理由を誰か教えてもらえますか?

$date = Zend_Date::now();
$date = $date->getIso();

if(Zend_Date::isDate($date, Zend_Date::ISO_8601)) {
    print('success');
} else {
    print('failure');
}

exit;

Zend_Date オブジェクトを渡すだけでも失敗します。

アップデート:

最初の $date オブジェクトの var_dump は次のようになります。

object(Zend_Date)#107 (8) { ["_locale:private"]=> string(5) "en_US" ["_fractional:private"]=> int(0) ["_precision:private"]=> int( 3) ["_unixTimestamp:private"]=> int(1257508100) ["_timezone:private"]=> string(14) "アメリカ/デンバー" ["_offset:private"]=> int(25200) ["_syncronized: private"]=> int(0) ["_dst:protected"]=> bool(true) }

$date->getIso() を呼び出した後の $date 文字列の var_dump は次のようになります。

文字列(25) "2009-11-06T04:48:20-07:00"

PHP 5.2.8 で ZF 1.9.5 を使用しています。それが違いを生む場合、私はWindows用のXAMPPも使用しています。

4

2 に答える 2

3

Ubuntu で ZF 1.9.4 と PHP 5.2.10 を実行していますが、まったく同じ問題を再現できました。好奇心旺盛なタイプなので、ちょっと掘り下げてみました。isDate のコード内では、最初にコンパニオン クラス Zend_Locale_Format 内の getDate が呼び出されます。これは try-catch ループにラップされているため、catch 部分内で例外を stdout にダンプしました。例外ダンプが私に示したものは次のとおりです。

例外「Zend_Locale_Exception」とメッセージ「日付を解析できません」
'2009-11-06T04:26:46-08:00' using 'dd mm yy' (dy)' in /usr/share/php/libzend-framework-php/Zend/Locale/Format.php:995
スタックトレース:
#0 /usr/share/php/libzend-framework-php/Zend/Locale/Format.php(1116): Zend_Locale_Format::_parseDate('2009-11-06T04:2...', 配列)
#1 /usr/share/php/libzend-framework-php/Zend/Date.php(4583): Zend_Locale_Format::getDate('2009-11-06T04:2...', 配列)
#2 {検閲済み}/testbed/test.php(26): Zend_Date::isDate('2009-11-06T04:2...', 'c')
#3 {メイン}

この例外で var_dump を実行すると、これらの不透明な配列についてもう少しわかりました。それぞれに次のものが含まれていました。

配列(4) {                                                                       
          ["ロケール"]=>                                                                   
          文字列(5) "en_US"                                                              
          ["date_format"]=>                                                              
          string(8) "dd mm yy"                                                           
          ["format_type"]=>                                                              
          文字列(3) "iso"                                                                
          ["修正日"]=>                                                                 
          bool(偽)                                                                    
        }           

したがって、date_format はまったく正しくありません。これは、PHP の日付フォーマットの専門用語で「YYYYMMDD'T'hh:mm:ssP」またはそのようなものである必要があります (T はタイムゾーンの省略形ではなく文字どおりの「T」であるため、T を引用しました)。確かに、PHP は単に「c」と省略します。

変。では、世界のどこでこの日付形式を取得しているのでしょうか? _getLocalizedToken から:

保護された静的関数 _getLocalizedToken($token, $locale)
    {
        スイッチ($トークン) {
            ケースセルフ::ISO_8601 :
                return "dd mm yy";
                壊す;
...

ISO_8601 が生成する出力を考えると、その形式は完全に間違っているように見えます。

適切な Zend リストに載っている人たちに確認することになると思いますが、一見したところ、これはバグ レポートに値するもののように見えます。たぶん、彼らはこの特定のタイプの日付文字列のチェックをまだサポートしていないのでしょうか?

于 2009-11-06T12:45:45.057 に答える
0

申し訳ありませんが、あなたがこれを投稿してから長い間これを読みました。あなたにとってうまくいかないコードは私にとってはうまくいきます。次のようにPHPソースでZend/Dateクラスをスタンドアロンで使用してみてください。


set_include_path('./lib' . PATH_SEPARATOR . get_include_path());
include_once 'Zend/Date.php';
...

また、おそらく php.ini を次のように設定する必要もあります。

include_path = ".:/usr/share/php:/usr/share/php/smarty/libs:/opt/zend/library"

または、あなたの zend ライブラリがどこにあるか。

次に、「成功」を示します。それが役立つことを願っています。

編集: おそらくプレーンな Zend の使用も無効にしたいでしょう。

編集: Zend エンジン v2.2.0./ PHP 5.2.6-1+lenny8 のように見える Zend 拡張機能 220060519 を使用しています。同じではなかったzendフレームワーク。しかし、私は間違っている可能性があります。このリンクは原因を見つけるのに役立ちましたが、当時の私の思考プロセスに関する記憶はほとんどありません:)

于 2010-04-14T20:38:25.433 に答える