2

ctime()関数は、渡された秒のエポック以降の時間を文字列形式で提供することになっています。これは私のコードです:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

int main(int argc, int **argv)
{
    time_t tmp=86400; // Seconds for one day
    char *s;
    s = ctime(&tmp);
    if(!s) perror("ctime");
    else printf("%s", s);
    return 0;
}

このプログラムは、私の Ubuntu 12.04、32 ビット マシンで正しい出力を提供します。

Fri Jan  2 01:00:00 1970

しかし、同じコードを使用しても、64 ビットの Scientific Linux マシンでは間違った出力が得られます。

Thu Jan  1 16:00:00 1970

どうやら、このマシンによるとエポックは次のとおりです。

Wed Dec 31 16:00:00 1969

Scientific Linux 6 が間違った出力を出す理由は何か分かりますか?!

4

3 に答える 3

4

値は常に [ 1 time_t] で、エポック (1970-01-01 00:00:00 UTC) からの秒数を表します。うるう秒をおそらく無視していることを確認するために必要なハンドウェーブをプ​​ラスまたはマイナスします。So(time_t)86400は、現在のタイム ゾーンに関係なく、ある瞬間を表します。

このctime()関数は、現地時間で表現された不自然な形式の [2] 文字列へのポインターを返します。私は UTC の 8 時間西にいるので、私のシステムでは、プログラムの出力は次のようになります。

Thu Jan  1 16:00:00 1970

(エポック プラス 24 時間から、86400私のタイム ゾーンのマイナス 8 時間)。

現在のタイムゾーンに関するシステムの考え方は、いくつかの方法のいずれかで決定できます。私のUbuntuシステムで/etc/timezoneは、行が含まれていますAmerica/Los_Angeles. Scientific Linux に似ているはずの CentOS に/etc/localtimeは、バイナリ タイムゾーン データ ファイルがあります。

両方のシステムで、システムのデフォルトのタイム ゾーンは、 UTC を示す または 空の文字列を使用$TZして環境変数を設定することで上書きできます。または のいずれかに設定するとUTC、プログラムの出力は次のようになります。$TZUTC""

Fri Jan  2 00:00:00 1970

エポックは歴史の中で常に同じ瞬間ですが、別の方法で表現することができます。例 (GNU Coreutilsdateコマンドを使用して、プログラムのようにエポックの 24 時間後ではなく、エポック自体を表示します):

$ date -d @0
Wed Dec 31 16:00:00 PST 1969
$ date -u -d @0
Thu Jan  1 00:00:00 UTC 1970
$ TZ=UTC date -d @0
Thu Jan  1 00:00:00 UTC 1970
$ TZ= date -d @0
Thu Jan  1 00:00:00 UTC 1970
$ 

英国にいる場合、現地時間が UTC と一致するのは 1 年の一部のみであることに注意してください。

[1] まあ、ほぼ常に。POSIX は、値がエポックからの秒数を表すことを保証しtime_tますが、C 標準は、それが時間を表すことができる算術型であるとだけ述べています。また、好きな値をtime_tオブジェクトに格納して、好きな意味を持たせることができますが、値を処理するすべての標準 C および POSIX 関数は、time_t値をエポックからの秒数として扱います。

ctime()[2] andによって作成された形式asctime()は、歴史的な理由から、かなり厄介です。という形Sun Sep 16 01:03:52 1973\n\0です。タイムゾーン情報がないことに注意してください。また、末尾'\n'が混乱する可能性があります (そのため、ログ ファイルに不要な空白行が表示されることがあります)。このstrftime()機能により、柔軟性が大幅に向上します。可能な限りISO 8601形式を使用することをお勧めします。

于 2013-02-09T01:32:10.693 に答える
1

秒数は UTC である必要があります - 1970 年 1 月 1 日 UTC 00:00 から経過した秒数

time_t の説明を見てください。

http://www.cplusplus.com/reference/ctime/time_t/

于 2013-02-08T22:30:28.567 に答える
1

あなたが参照するマニュアルページは言う

ctime()、gmtime()、および localtime() 関数はすべて、カレンダー時間を表すデータ型 time_t の引数を取ります。絶対時間値として解釈される場合、エポック (1970-01-01 00:00:00 +0000 (UTC)) から経過した秒数を表します。

そして、これはctimeの実装です

char *
ctime(timep)
const time_t * const    timep;
{
    return asctime(localtime(timep));
}

ご覧のとおり、localtime、つまり現在のプロセスのタイムゾーンに相対的な時間を使用しています。

于 2013-02-08T22:43:21.337 に答える