2

私はphp 5.2.6の問題に取り組んでいます。私たちが使用する API は、この形式 DDMMYYYYHHMM で日付を返します。まさにその形式、固定長、区切り記号なし。ただし、私の実験では、この形式は strptime を壊しているようで、この形式で日付を入力すると false (失敗) が返されます。少なくとも私のシステムでは、次の例で再現できます。

$format = "%d%m%Y%H%M"; echo print_r(strptime(strftime($format,1225405967),$format),true);

日付と時刻の間に文字を追加すると、スペースでも機能します。したがって、これは機能します:

$format = "%d%m%Y %H%M"; echo print_r(strptime(strftime($format,1225405967),$format),true);

明らかな何かが欠けていますか?

編集:これに加えて、コメントによって示される結果により、これはプラットフォーム固有のようです。オフィスで OSX Leopard を実行している Mac で再現できますが、Linux ボックスでは問題なく解析されます。OSXの* nixの基礎となるCライブラリのstrptimeのバグまたは特異性であると思います。

4

5 に答える 5

1

この関数はロケールに依存します。別のロケールを設定しようとしましたか? ( を参照setlocale())

于 2008-11-01T19:51:09.713 に答える
1

問題が MacOS X と C ライブラリにあると思われる場合は、それを示すテスト ケースを作成できます。たとえば、MacOS X 10.4.11 (PPC、G4、32 ビット) で以下のコードを実行し、出力を得ました。

Now: 1225573977
Formatted (12): 011120082112
End: 0xBFFFF553 (Buffer: 0xBFFFF547)
Then: year = 2008, month = 11, day = 1, hour = 21, minute = 12
Reformatted (12): 011120082112

私が使用したコードは次のとおりです。

#include <time.h>
#include <stdio.h>

int main(void)
{
    time_t now = time(0);
    struct tm *tm = gmtime(&now);
    char format[] = "%d%m%Y%H%M";
    char buffer1[64];
    char buffer2[64];
    size_t f_len = strftime(buffer1, sizeof(buffer1), format, tm);
    struct tm then;
    char *end = strptime(buffer1, format, &then);
    size_t p_len = strftime(buffer2, sizeof(buffer2), format, &then);

    printf("Now: %ld\n", (long)now);
    printf("Formatted (%lu): %s\n", (unsigned long)f_len, buffer1);
    printf("End: 0x%08lX (Buffer: 0x%08lX)\n", (unsigned long)end, (unsigned long)buffer1);
    printf("Then: year = %d, month = %d, day = %d, hour = %d, minute = %d\n",
            then.tm_year + 1900, then.tm_mon + 1, then.tm_mday, then.tm_hour, then.tm_min);
    printf("Reformatted (%lu): %s\n", (unsigned long)p_len, buffer2);

    return(0);
}

私が見たところ、私が使用しているバージョンでは strptime() にバグはありません。存在しないエラー チェックのメリット、および印刷におけるキャストと C99<inttypes.h>表記のメリットについて議論することはできますが、コードは十分に正確だと思います。;gmtime()の代わりに使用しました。localtime()それが問題を再現しない要因であったかどうかは疑問です。

たぶん、PHP テスト スイートを確認する必要がありますか? PHP でエラーが発生した場所を検出するために、かなり複雑な式を分割する必要があるのではないでしょうか?

于 2008-11-01T21:17:50.270 に答える
0

私が確認する:

    $p = strptime("09.02.2002", "%d.%m.%Y");
    var_dump($p);

出力:

array(9){["tm_sec"] => int(0)["tm_min"] => int(0)["tm_hour"] => int(0)["tm_mday"] => int(9)[ "tm_mon"] => int(1)["tm_year"] => int(102)["tm_wday"] => int(0)["tm_yday"] => int(0)["unparsed"] => string(0) ""}

OS X Leopard、PHP 5.3.2

于 2011-08-17T13:24:38.797 に答える
0

これはまだ Windows に実装されていないため、Mac のみに限定されている可能性が非常に高いです (私はその提案を伝えましたが)。

5.2.6
Fatal error: Call to undefined function strptime() in F:\htdocs\strptime.php on line 5

私なら、bugs.php.netでバグを送信します。

于 2008-11-01T20:19:30.543 に答える
0

どちらのバージョンも PHP 5.2.0 で正常に動作するため、明らかなことは何もありません。ただ、現時点では 5.2.6 を簡単に確認することはできません。それは私が家に帰るまで待たなければなりません。

于 2008-10-31T18:05:19.613 に答える