10

mktime() を呼び出すと、2 月 1 日が 1 月 31 日より前に来るように見えます。これはなぜですか? 私は何か間違ったことをしていますか、それとも glibc のバグですか?

コードは次のとおりです。

struct tm tm;
time_t tt;

memset(&tm, 0, sizeof(tm));
tm.tm_year = 2011;
tm.tm_mon = 1;
tm.tm_mday = 31;
tm.tm_hour = 11;
tm.tm_min = 41;
tm.tm_sec = 28;
tm.tm_isdst = 0;
tt = mktime(&tm);

printf("Time now %d-%d-%d %d:%d:%d (%s) = %lu\n",
    tm.tm_year, tm.tm_mon, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec, tm.tm_zone, tt);


memset(&tm, 0, sizeof(tm));
tm.tm_year = 2011;
tm.tm_mon = 2;
tm.tm_mday = 1;
tm.tm_hour = 1;
tm.tm_min = 1;
tm.tm_sec = 1;
tm.tm_isdst = 0;
tt = mktime(&tm);

printf("Time now %d-%d-%d %d:%d:%d (%s) = %lu\n",
    tm.tm_year, tm.tm_mon, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec, tm.tm_zone, tt);

出力は次のとおりです。

Time now 2011-2-3 11:41:28 (PST) = 61257325288
Time now 2011-2-1 1:1:1 (PST) = 61257114061

元々の意図は 2 つの time_t を比較することであったことに注意してください。この問題により、最初の日付/時刻が 2 番目の日付/時刻よりも遅く表示されますが、これは明らかに問題です。

これは、「gcc test.c」でコンパイルされ、Ubuntu 9.10、gcc バージョン 4.4.1 (Ubuntu 4.4.1-4ubuntu8)、libc-2.10.1-0ubuntu15 で「./a.out」で実行されます。

32 ビット システムでは、結果は期待どおりです。つまり、64 ビットの結果とはまったく異なります。

この結果を確認/反論したり、私が間違っている可能性があることについて洞察を与えたりしたい人はいますか?

4

2 に答える 2

12

tm_mon は 0 から始まるため、正規化された 2 月 31 日を設定しようとしました。mktime()の定義へのリンクは次のとおりです。

于 2011-02-02T20:21:08.170 に答える