2008-10-31 63 views
2

我摔跤與PHP 5.2.6的問題。我們使用的api返回日期格式爲DDMMYYYYHHMM。確切地說,這種格式,固定長度,沒有分隔符。然而,在我的實驗中,這種格式似乎打破了strptime,當我以這種格式提供日期時,它返回一個錯誤(失敗)。它可以再現,至少在我的系統上,這個例子:PHP strptime格式錯誤?

$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庫中strone的bug或特性。

+0

你使用的是哪個平臺?我在PHP 5.2.6(cli)Linux Kernel 2.6.9-55上試過你的例子,並且有兩個看起來完全相同的數組輸出。 – Brian 2008-10-31 17:25:06

+0

我的開發平臺是OSX Leopard和Apache2。有趣的結果,謝謝你的迴應。 – user33150 2008-10-31 17:35:51

回答

0

沒有什麼明顯的,因爲這兩個版本在PHP 5.2.0中工作正常。不過,我現在無法立即檢查5.2.6。這將不得不等到我回家。

1

該函數是語言環境相關的。你有沒有嘗試設置不同的語言環境? (請參閱setlocale()

0

這很可能僅與Mac隔離,因爲它甚至還沒有在Windows上實現過(儘管我已經通過了該建議)。

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

我會繼續並提交一個bug在bugs.php.net

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中發生錯誤的位置?

0

我確認:

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

輸出:

陣列(9){ [ 「tm_sec」] => INT(O) [ 「tm_min」] => INT(0 ) [ 「tm_hour」] => INT(O) [ 「tm_mday」] => INT(9) [ 「tm_mon」] => INT(1) [ 「tm_year」] => INT (102) [ 「tm_wday」] => INT(O) [ 「tm_yday」] => INT(O) [ 「未解析」] => 串(0) 「」 }

OS X豹,PHP 5.3.2