如果您認爲問題出現在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中發生錯誤的位置?
你使用的是哪個平臺?我在PHP 5.2.6(cli)Linux Kernel 2.6.9-55上試過你的例子,並且有兩個看起來完全相同的數組輸出。 – Brian 2008-10-31 17:25:06
我的開發平臺是OSX Leopard和Apache2。有趣的結果,謝謝你的迴應。 – user33150 2008-10-31 17:35:51