在PHP的exec中使用mktime运行C代码

nma*_*mat 5 php c date mktime

我有一个奇怪的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;
}
Run Code Online (Sandbox Code Playgroud)

当我在shell中运行它时,我得到了正确的结果(打印格式是月份,小时,分钟):

$ ./test
17 20 7
17 20 8
17 20 9
Run Code Online (Sandbox Code Playgroud)

但是,当我通过PHP执行它时,我得到了奇怪的结果.这是PHP代码:

<?php
exec("path_to_exec/test", $output);
echo "$output[0]<br/>";
echo "$output[1]<br/>";
echo "$output[2]<br/>";
?>
Run Code Online (Sandbox Code Playgroud)

这是输出:

17 20 7
17 17 8
17 14 9
Run Code Online (Sandbox Code Playgroud)

时间显然是错误的.任何人都知道可能导致这种情况的原因是什么?

net*_*der 3

问题出在 C 代码上,而不是 PHP 代码上:

当你这样做时:

rawtime = mktime(ptm);
Run Code Online (Sandbox Code Playgroud)

指针ptm由函数修改mktime。因此,如果您这样做:

rawtime = mktime(ptm);
ptm = gmtime(&rawtime);
Run Code Online (Sandbox Code Playgroud)

您实际上操作了指针两次,因此出现了奇怪的结果。

代替上面的操作,只需执行以下操作:

mktime(ptm);
snprintf(...);
Run Code Online (Sandbox Code Playgroud)

你会得到预期的结果。因此,完整的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++;
Run Code Online (Sandbox Code Playgroud)