首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP strptime格式错误?

PHP strptime格式错误?
EN

Stack Overflow用户
提问于 2008-10-31 17:10:38
回答 5查看 2.2K关注 0票数 2

我正在努力解决php 5.2.6的问题。我们使用的api返回DDMMYYYYHHMM格式的日期。格式完全相同,固定长度,没有分隔符。然而,在我的实验中,这种格式似乎破坏了strptime,当我以这种格式向它提供日期时,它会返回一个false (失败)。它可以重现,至少在我的系统上,用这个例子:

代码语言:javascript
复制
$format = "%d%m%Y%H%M"; echo print_r(strptime(strftime($format,1225405967),$format),true);

如果我在日期和时间之间添加任何字符,它都可以工作,甚至是一个空格。所以,这是可行的:

代码语言:javascript
复制
$format = "%d%m%Y %H%M"; echo print_r(strptime(strftime($format,1225405967),$format),true);

我是不是漏掉了什么明显的东西?

编辑:在此基础上,根据评论指出的结果,这似乎是特定于平台的。我可以在办公室里运行OSX Leopard的Mac上重现它,但Linux机器可以很好地解析它。我假设这是OSX的*nix中底层C库中的strptime的bug或特性。

EN

回答 5

Stack Overflow用户

发布于 2008-11-01 19:51:10

此函数依赖于区域设置。你试过设置不同的语言环境吗?(参见setlocale())

票数 1
EN

Stack Overflow用户

发布于 2008-11-01 21:17:50

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

代码语言:javascript
复制
Now: 1225573977
Formatted (12): 011120082112
End: 0xBFFFF553 (Buffer: 0xBFFFF547)
Then: year = 2008, month = 11, day = 1, hour = 21, minute = 12
Reformatted (12): 011120082112

我使用的代码是:

代码语言:javascript
复制
#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()中没有bug。我们可以讨论不存在的错误检查的优点,以及打印中的强制转换和C99 <inttypes.h>符号的优点,但我认为代码足够准确。我使用了gmtime()而不是localtime();我怀疑这是否是不能重现问题的一个因素。

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

票数 1
EN

Stack Overflow用户

发布于 2008-10-31 18:05:20

没有什么明显的问题,因为两个版本都可以在PHP 5.2.0中正常工作。不过,我目前还不能很容易地检查5.2.6。那就得等到我到家了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/254244

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档