14

以下のコードを実行しています。

int main()
{
struct tm storage={0,0,0,0,0,0,0,0,0};
char *p = NULL; 
p = (char *)strptime("2012-08-25 12:23:12","%Y-%m-%d %H:%M:%S",&storage);
char buff[1024]={0};
strftime(buff,1024,"%Y-%m-%d %H:%M:%S",&storage);
cout << buff << endl;
storage.tm_sec += 20;
strftime(buff,1024,"%Y-%m-%d %H:%M:%S",&storage);
cout << buff << endl;
mktime(&storage);
strftime(buff,1024,"%Y-%m-%d %H:%M:%S",&storage);
cout << buff << endl;
return 0;
}

上記のプログラムを実行すると、「2012-08-2512:23:32」の代わりに「2012-08-2513:23:32」が出力されます。tm_hour値が増加している理由を教えてください。プログラムに「2012-02-2512:23:32」と入力した日付を入力すると、これは正しく機能します。これは混乱を招きます。

出力->

[user@rtpkvm55-vm2 root]$ ./a.out
2012-08-25 12:23:12
2012-08-25 12:23:32
2012-08-25 13:23:32
[user@rtpkvm55-vm2 root]$

私のシステムの日付情報、->

[user@rtpkvm55-vm2 root]$ date
Sat Aug 25 08:28:26 EDT 2012
4

3 に答える 3

19

何が起こるのですか

指定した日付には夏時間が有効ですが、を呼び出すmktimeときstorage.tm_isdstはゼロです。mktimeこれを見て、「ねえ、彼らは私に間違った夏時間フラグの日付を教えてくれたので、それを修正しましょう」と思います。次にtm_isdst、1に設定して変更しますtm_hour

この回答も参照してください。

それを修正するには

  • timegmの代わりに使用mktime
  • 呼び出す前にタイムゾーンをUTCに設定しmktimeます(の例も参照timegm):
    setenv( "TZ"、 ""、1);
    tzset();
    mktime();
  • 適切な日時ライブラリを使用します(boost :: locale :: date_time / boost :: date_timeboost::locale::date_timeなどですが、選択する前にページのQ&Aセクションをお読みください)
于 2012-08-25T14:02:18.230 に答える
5

うわー、それを回避する方法はありません。これは、システムのmktime(3)の実装のバグである必要があります。mktime(3)は、struct tm *渡されたものを変更しないでください。

の値を確認することをお勧めしますstorage.tm_isdst。DSTについて混乱しないように、0に設定してみてください。それでも問題が解決しない場合は、-1に設定して、適切な値を自動的に判別できるようにしてください。

mktime-分解された時間をエポック以降の時間に変換します

tm_isdstの値が正または0の場合、mktime()は、最初に、夏時間が指定された時間に有効であるか無効であるかをそれぞれ推定します。tm_isdstの値が負の場合、mktime()は、指定された時間に夏時間が有効であるかどうかを判別しようとします。


mktime(3)が変更されないことについて間違っていましたstruct tm *。値を正規化するのは正しい動作です。

于 2012-08-25T13:27:15.140 に答える
0

構造体に設定する必要がありtm_isdstますtm。そうしないと、初期化されないため、ランダムなガベージ値に設定されます。mktime次に、変数に含まれるランダムなガベージに応じて呼び出すとtm_isdst、夏時間が適用されるか、適用されないかのどちらかであり、予想外のようです。

ただし、に設定すると-1mktime夏時間が有効かどうかわからないことがわかるため、最初の呼び出しでmktime修正されます。

したがって、この問題を修正する最も簡単な方法は、次を追加することです。

storage.tm_isdst = -1;

を呼び出す前にmktime

于 2021-02-04T01:37:58.657 に答える