English 中文(简体)
PHP strptime 格式错误?
原标题:
  • 时间:2008-10-31 17:10:38
  •  标签:

我正在解决一个php 5.2.6的问题。我们使用的一个api返回的日期格式为DDMMYYYYHHMM。这个格式是固定长度的,没有分隔符。然而,在我的实验中,这个格式似乎会破坏strptime,当我用这个格式的日期进行输入时,它返回一个错误(fail)。在我的系统上,这个问题是可以重现的,例如:

$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的一个错误或特殊情况。

问题回答

这个函数依赖于所在地区。您尝试过设置不同的所在地区吗?(请参阅setlocale())。

如果您认为问题出在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
", (long)now);
    printf("Formatted (%lu): %s
", (unsigned long)f_len, buffer1);
    printf("End: 0x%08lX (Buffer: 0x%08lX)
", (unsigned long)end, (unsigned long)buffer1);
    printf("Then: year = %d, month = %d, day = %d, hour = %d, minute = %d
",
            then.tm_year + 1900, then.tm_mon + 1, then.tm_mday, then.tm_hour, then.tm_min);
    printf("Reformatted (%lu): %s
", (unsigned long)p_len, buffer2);

    return(0);
}

根据我所看到的,我使用的版本中的strptime()没有任何错误。我们可以辩论不存在的错误检查和强制转换与打印中的C99 <inttypes.h>符号的优点,但我认为代码足够准确。我使用了gmtime()而不是localtime();我怀疑这没有成为不重现问题的因素。

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?

由于两个版本都在PHP 5.2.0上正常工作,因此没有明显的问题。目前我无法立即检查5.2.6版本。那得等我回家。

这可能仅限于Mac系统,因为这甚至还没有在Windows上实施(尽管我已经提出了这个建议)。

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

我会前往 bugs.php.net 提交错误报告。

我确认:

    $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 10.5 美洲豹,PHP 5.3.2





相关问题
热门标签