5

PHP と現在の時刻を使用する C スクリプトで奇妙な問題が発生しています。私のプログラムは少し複雑ですが、問題は次のように絞り込まれます。

1分前の日付、現在の日付、および1分後の日付を出力するこのCコードがあります。

#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;
}

これをシェルで実行すると、正しい結果が得られます (印刷形式は日、時、分です)。

$ ./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

時間は明らかに間違っています。誰がこれを引き起こしているのか考えていますか?

4

1 に答える 1

3

問題は PHP コードではなく、C コードにあります。

これを行う場合:

rawtime = mktime(ptm);

ptmポインターは関数によって変更されますmktime。したがって、これを行う場合:

rawtime = mktime(ptm);
ptm = gmtime(&rawtime);

実際にはポインターを 2 回操作しているため、奇妙な結果になります。

上記の代わりに、次のようにします。

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++;
于 2011-11-17T20:56:11.367 に答える