我遇到了一个奇怪的PHP问题和一个使用当前时间的C脚本。我的程序有点复杂,但问题缩小了:
我有这个C代码,它打印1分钟前的日期,当前日期和从现在起1分钟后的日期:
#include <time.h>
#include <stdio.h>
int main(int argc, char **argv){
char date[9];
time_t rawtime;
struct tm * ptm;
int i;
time(&rawtime);
ptm = gmtime(&rawtime);
ptm->tm_min--;
for(i = 0; i < 3; i++){
rawtime = mktime(ptm);
ptm = gmtime(&rawtime);
snprintf(date, 9, "%d %d %d", ptm->tm_mday, ptm->tm_hour, ptm->tm_min);
printf("%s\n", date);
ptm->tm_min++;
}
return 0;
}
当我在shell中运行它时,我得到了正确的结果(打印格式是月份,小时,分钟):
$ ./test
17 20 7
17 20 8
17 20 9
然而,当我通过PHP执行它时,我得到了奇怪的结果。这是PHP代码:
<?php
exec("path_to_exec/test", $output);
echo "$output[0]<br/>";
echo "$output[1]<br/>";
echo "$output[2]<br/>";
?>
这是输出:
17 20 7
17 17 8
17 14 9
时间显然是错误的。任何人都知道造成这种情况的原因是什么?
答案 0 :(得分:3)
问题在于C代码,而不是PHP代码:
执行此操作时:
rawtime = mktime(ptm);
ptm
指针由mktime
函数修改。因此,如果您这样做:
rawtime = mktime(ptm);
ptm = gmtime(&rawtime);
你实际上操纵指针两次,因此产生了奇怪的结果。
而不是上述内容,只需:
mktime(ptm);
snprintf(...);
您将获得预期的结果。因此,完整的for
循环代码将是:
mktime(ptm);
snprintf(date, 9, "%d %d %d", ptm->tm_mday, ptm->tm_hour, ptm->tm_min);
printf("%s\n", date);
ptm->tm_min++;