2

現在の真夜中のエポックからの秒数を取得する次の関数があります。

long int midnight_time()
{
  time_t t;
  struct tm *local;
  t = time(NULL);
  struct tm timeinfo;
  local = localtime(&t);
  timeinfo.tm_year = local->tm_year;
  timeinfo.tm_mon = local->tm_mon;
  timeinfo.tm_mday = local->tm_mday;
  timeinfo.tm_hour = 0;
  timeinfo.tm_min=0;
  timeinfo.tm_sec=0;
  long int midnight_epoch = mktime(&timeinfo);
  return midnight_epoch;
}

この関数をコードで2回呼び出したとき、たとえば

cout<<midnight_time()<<endl;
cout<<midnight_time()<<endl;

たとえば、1367816400 1367812800 など、一貫して根本的に異なる結果が得られます。

これは約4000秒の差です。数値が同じであることを期待します。誰かが私が間違っていることを見ることができますか?

4

3 に答える 3

2

初期化されていないメモリ位置 (あなたのケースのようです) によって引き起こされる問題を回避するには、localtime関数によってポインターが返される tm 構造体を使用する必要があります。以下に例を示します。

time_t midnight_time()
{
  struct tm *local;
  time_t now = time(NULL);
  local = localtime(&now);

  local->tm_hour = 0;
  local->tm_min=0;
  local->tm_sec=0;

  return mktime(local);
}

@jmihalicza の方が質問に適切に答えてくれます。これは、コードを改善するための単なる提案です。

于 2013-05-07T01:53:09.850 に答える
1

tm_isdst問題は、@jmihalicza の回答で示唆されているように、構造体からフラグを設定しないことですlocal。おそらく、時間が 1 時間異なるため、2 つの構造体の 1 つでフラグが反対になり、mktime1 時間異なる時間が生成されます。

ただし、使用する代わりにmktime、時間、分、および秒を単純に取り消す方が簡単な場合があります (ただし、これは DST 移行中にはうまく機能しません - それがあなたの要因であるかどうかは、あなたの質問からはわかりません)。

return t - (timeinfo.tm_hour * 3600) - (timeinfo.tm_min * 60) - timeinfo.tm_sec;
于 2013-05-07T01:26:38.540 に答える