我正在与php 5.2.6问题搏斗。我们使用的api以此格式返回日期DDMMYYYYHHMM。正是那种格式,固定长度,没有分隔符。但是,在我的实验中,这种格式似乎打破了strptime,当我以这种格式提供日期时,它会返回false(失败)。至少在我的系统上,它可以通过这个例子再现:
$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的错误或特性。
答案 0 :(得分:1)
此功能与语言环境有关。您是否尝试过设置不同的区域设置? (见setlocale()
)
答案 1 :(得分: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中错误发生的位置?
答案 2 :(得分:0)
没有什么明显的,因为这两个版本在PHP 5.2.0中运行良好。不过,我现在不能轻易检查5.2.6。那将不得不等到我回家。
答案 3 :(得分:0)
这很可能只是与Mac分离,因为这还没有在Windows上实现(尽管我已经通过了这个建议)。
5.2.6
Fatal error: Call to undefined function strptime() in F:\htdocs\strptime.php on line 5
我会继续在bugs.php.net提交错误。
答案 4 :(得分:0)
我确认:
$p = strptime("09.02.2002", "%d.%m.%Y");
var_dump($p);
输出:
array(9){ [ “tm_sec”] =&GT; INT(0) [ “tm_min”] =&GT; INT(0) [ “tm_hour”] =&GT; INT(0) [ “tm_mday”] =&GT; INT(9) [ “tm_mon”] =&GT; INT(1) [ “tm_year”] =&GT; INT(102) [ “tm_wday”] =&GT; INT(0) [ “tm_yday”] =&GT; INT(0) [ “未解析”] =&GT; string(0)“” }
OS X Leopard,PHP 5.3.2