PHP strptime biçim bug?

5 Cevap php

Ben bir php 5.2.6 sorunu ile güreş duyuyorum. Biz döner kullanmak bir API, bu biçimi DDMMYYYYHHMM tarihleri. Tam olarak bu biçimi, sabit uzunlukta, hiçbir ayraclar. Ancak, benim deney, bu formatı ben bu biçimde o bir tarih besleniyorsa (başarısız) bir yanlış döndüren, strptime kırmak gibi görünüyor. Bu örnek ile, en azından benim sistemde, çoğaltılamaz yapabilirsiniz:

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

Ben tarih ve zaman arasında herhangi bir karakter eklerseniz, hatta bir uzay çalışır. Yani, bu işi MU:

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

Ben belirgin bir şey eksik?

edit: bu ve yorum tarafından gösterilen sonuçlar nedeniyle daha fazla, bu özel bir platform gibi görünüyor. Ben ofiste OSX Leopard çalıştıran Mac'ler üzerinde üretebileceği ancak Linux kutuları ince ayrıştırmak. Ben OSX * nix içinde yatan C kütüphanesinde strptime bir hata veya idiosyncrasy olduğunu varsayalım.

5 Cevap

Bu fonksiyon yerel bağlıdır. Farklı yerel ayarı denediniz mi? (setlocale() bakınız)

Açık bir şey her iki sürümü PHP 5.2.0 ince çalışır beri. Ben kolayca olsa, şu anda 5.2.6 kontrol edemez. Ben eve kadar beklemek zorunda kalacak.

Bu bile henüz Windows uygulamaya konmamıştır gibi (ben birlikte bu öneri ilettik rağmen), bu sadece Mac'ler için izole olması çok olasıdır.

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

Devam edin ve bugs.php.net bir hata sunacağını.

Eğer sorun MacOS X ve C kütüphanesinde olduğunu düşünüyorsanız, o zaman bunu göstermek için bir test case üretmek olabilir. Örneğin, ben MacOS X 10.4.11 (PPC, G4, 32-bit) aşağıdaki kodu koştu ve çıkışı var:

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

Ben kullanılan kod:

#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);
}

Gördüklerime dayanarak, strptime hiçbir hata () Ben kullanıyorum sürümü var. Biz varolmayan hata denetimi yararları hakkında tartışma ve C99 baskı <inttypes.h> gösterimler karşı atmalarını, ama ben kod yeterince doğru olduğunu düşünebiliriz. I-gmtime() yerine localtime() el; Bu sorunu yeniden değil bir faktör olduğunu sanmıyorum.

Maybe you should look at the PHP test suite? Maybe you should split your rather complex expression into pieces to detect where the error occurs in PHP?

Ben onaylamak:

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

Çıktı:

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