3

これら2つの機能の違いは何ですか?それらは同じでなければならないというのが私の理解でした:http ://www.gnu.org/software/libc/manual/html_node/Broken_002ddown-Time.html 。

私は変換をテストするためにこのコードを書きました(Qtの部分は比較のためだけです):

#include <QCoreApplication>
#include <QDateTime>

int main(int argc, char *argv[])
{
   QCoreApplication a(argc, argv);

   QDateTime datetime(QDate(2012, 3, 25), QTime(5, 15));
   qDebug("Timestamp: %lld.", datetime.toMSecsSinceEpoch()/1000L);

   time_t timestamp;
   tm* timeinfo = localtime(&timestamp);
   timeinfo->tm_hour = 5;
   timeinfo->tm_mday = 25;
   timeinfo->tm_min  = 15;
   timeinfo->tm_mon  = 2;
   timeinfo->tm_year = 112;
   timeinfo->tm_sec  = 0;
   qDebug("Timestamp: %ld.", timelocal(timeinfo));

   return 0;
}

そして、出力が次のようになっていることがわかりました。

Timestamp: 1332645300.
Timestamp: 1332645300.

それは私が期待することです。次に、に置き換えtimelocalmktime、これが出力であることがわかりました。

Timestamp: 1332645300.
Timestamp: 1332648900.

1時間が追加されたようです(現在のタイムゾーンがGMT + 2:00で、ロケールがイタリアに設定されていることを考慮してください)。なんで?2つの違いは何mktimeですか?また、設定した日付に1時間を追加するのはなぜですか?

編集:もう一度テストしたところ、Mac OS X(およびiOS)では、構造体にtimelocal配置された同じ時間が返されているようですが、実際には、戻り値と構造体の両方に1時間が追加されています。timeinfomktimetime_ttm

代わりにLinuxKubuntuでは、両方の関数を使用すると、tm構造体と戻り値の両方に1時間が追加されます。

理由を説明できる人はいますか?

4

1 に答える 1

6

OpenBSDのtimelocal状態の人:

timelocalmktime()は非推奨のインターフェースであり、負の値で呼び出すのと同じ です。tm_isdst

の負の値は、夏時間(DST)が考慮されtm_isdstていないことを意味します。DSTにも問題がtimelocalあるようです。一方、DSTを処理します。これは、OSXでの1時間の違いを説明している可能性があります。QDateTime
mktime

は非推奨であるためtimelocal、DSTを適切に処理する新しい実装が含まれている可能性があります。

于 2012-06-15T22:08:34.330 に答える