値は常に [ 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
、プログラムの出力は次のようになります。$TZ
UTC
""
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形式を使用することをお勧めします。