2

ここに関数があります

time_t time_from_string(const char* timestr)
{
    if (!timestr)
        return 0;

    struct tm t1;
    memset(&t1, 0, sizeof(t1));
    int nfields = sscanf(timestr, "%04d:%02d:%02d %02d:%02d:%02d", 
                  &t1.tm_year, &t1.tm_mon, &t1.tm_mday, &t1.tm_hour, 
                  &t1.tm_min, &t1.tm_sec);
    if (nfields != 6)
        return 0;

    t1.tm_year -= 1900;
    t1.tm_mon--;
    t1.tm_isdst = -1; // mktime should try itself to figure out what DST was

    time_t result = mktime(&t1);
    return result;
}

引数「2007:11:14 11:19:07」で呼び出すと、Linux (Ubuntu 12.04、gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3) では 1195028347、Windows (windows) では 1195024747 が返されます。 7、Visual Studio 2010)。

ご覧のとおり、時差は 3600 です。

MSK タイム ゾーンにある同じコンピューター (デュアル ブート) で両方のオペレーティング システムを実行しています。どちらの OS もインターネット時刻と同期されており、システム クロックは正確な時刻を示しています。

この関数を別の引数「2012:08:21 18:20:40」で呼び出すと、両方のシステムで 1345558840 が返されます。

いくつかのケースで結果が異なるのはなぜですか?

編集 言及するのを忘れました。への呼び出し後に t1 変数の内容を制御しますmktime()

両方のシステムで:

t1.tm_sec = 7;
t1.tm_min = 19;
t1.tm_hour = 11;
t1.tm_mday = 14;
t1.tm_mon = 10;
t1.tm_year = 107;
t1.tm_wday = 3;
t1.tm_yday = 317;

t1.tm_isdst = 0;

最後の行に言及してください。どちらのシステムも、有効な夏時間がないと判断します。

Linux では、さらに次のフィールドが に表示されstruct tmます。

t1.gmtoff = 10800;
t1.tm_zone = "MSK";
4

1 に答える 1