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

标签 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;
}

当我在 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

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

最佳答案

问题出在 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++;

关于php - 在 PHP exec 中使用 mktime 运行 C 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8173909/

相关文章:

php - PHP的addslashes和mysql(i)_escape_string有什么区别?

php - 如何在数据库查询结果中显示多个html表中的数据

C-结构中的结构

c - 使用指针替换值

c - C中的引导加载程序无法编译

Mysql SQL for "replace everything but this"where xxx

sql-server - 两个星期一晚上之间的sql

java - Mongo - Java - 获取所有文档将字符串日期排序为日期

php - 如何使 PoEdit 正确解析自定义 "ngettext"实现?

php - MySQL/MariaDB 不接受 JSON 格式?无法创建数据库