strftime
関数を使用して、現在の utc 時刻を文字列にエンコードしようとしています。
time_t now;
struct tm nowLocal;
struct tm nowUtc;
now = time(NULL);
localtime_r(&now, &nowLocal);
gmtime_r(&now, &nowUtc);
これまでのところnowLocal
、私のタイムゾーン(CET)で現在の時刻が含まnowUtc
れており、utc 時刻が含まれています。違いはtm_gmtoff
値に正確に従っています。
nowLocal: {tm_sec = 28, tm_min = 27, tm_hour = 13, tm_mday = 23, tm_mon = 4, tm_year = 112, tm_wday = 3, tm_yday = 143, tm_isdst = 1, tm_gmtoff = 7200, tm_zone = 0x8127a38 "CEST"}
nowUtc: {tm_sec = 28, tm_min = 27, tm_hour = 11, tm_mday = 23, tm_mon = 4, tm_year = 112, tm_wday = 3, tm_yday = 143, tm_isdst = 0, tm_gmtoff = 0, tm_zone = 0x3e9907 "GMT"}
次に、エポックからの秒数を取得するために formatstrftime()
を呼び出します。"%s"
char tsFromLocal[32];
char tsFromUtc[32];
strftime(tsFromLocal, sizeof(tsFromLocal), "%s", &nowLocal);
strftime(tsFromUtc, sizeof(tsFromUtc), "%s", &nowUtc);
結果は私には奇妙に思えます。フォーマットは次のように記述されているため、両方のstrftime()
呼び出しからまったく同じ文字列を取得することを期待していました。%s
エポックからの秒数、つまり since 1970-01-01 00:00:00 UTC
。うるう秒のサポートが利用可能でない限り、うるう秒はカウントされません。
しかし、私は2つの異なる値を得ました:
tsFromLocal:"1337772448"
tsFromUtc: "1337768848"
しかもその差は7200 ( tm_gmtoff
) ではなく3600です。誰もそのような行動を説明できますか? それともバグですか?
これを行っている理由は、時間の値をネットワーク経由で転送し、異なるタイム ゾーンにあるターゲット マシンの現在の時間と比較する必要があるためです。ターゲットマシンで私がしたかった:
struct tm restoredUtc;
time_t restored;
strptime(tsFromUtc, "%s", &restoredUtc);
restored = timegm(&restoredUtc);
しかし、私は得ました:
restoredUtc:{tm_sec = 28, tm_min = 27, tm_hour = 12, tm_mday = 23, tm_mon = 4, tm_year = 112, tm_wday = 3, tm_yday = 143, tm_isdst = 1, tm_gmtoff = 7200, tm_zone = 0x8127a38 "CEST"}
とにかく、現在のタイムゾーンに従って をstrptime()
設定します。tm_zone
しかし、timelocal()
代わりに使用しても、 12:27:28 CESTではなく11:27:28 CESTtimegm()
である必要があるため、正しい値が得られません。このエラーは の異なる結果に関連していますか?strftime()
この後半へのコメントはありますか?