2

我正在努力解决 php 5.2.6 的问题。我们使用的 api 以这种格式返回日期 DDMMYYYYHHMM。正是这种格式,固定长度,没有分隔符。但是,在我的实验中,这种格式似乎会破坏 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 库中 strptime 的错误或特性。

4

5 回答 5

1

此功能取决于区域设置。您是否尝试过设置不同的语言环境?(见setlocale()

于 2008-11-01T19:51:09.713 回答
1

如果您认为问题出在 MacOS X 和 C 库中,那么您可以生成一个测试用例来演示它。例如,我在 MacOS X 10.4.11 (PPC, G4, 32-bit) 上运行下面的代码,得到了输出:

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() 没有错误。我们可以讨论不存在错误检查的优点,以及<inttypes.h>打印中的强制转换与 C99 表示法的优点,但我认为代码足够准确。我用gmtime()代替localtime(); 我怀疑这是否是不重现问题的一个因素。

也许你应该看看 PHP 测试套件?也许您应该将您相当复杂的表达式拆分为多个部分,以检测 PHP 中错误发生的位置?

于 2008-11-01T21:17:50.270 回答
0

这很可能仅与 Mac 隔离,因为这甚至还没有在 Windows 上实现(尽管我已经通过了这个建议)。

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 回答
0

我确定:

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

输出:

数组(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"]=>字符串(0)“”}

OS X 豹,PHP 5.3.2

于 2011-08-17T13:24:38.797 回答