#include <sys/time.h> int gettimeofday(struct timeval *tv, struct timezone *tz); int settimeofday(const struct timeval *tv, const struct timezone *tz);glibc 向けの機能検査マクロの要件 (feature_test_macros(7) 参照):
struct timeval { time_t tv_sec; /* 秒 */ suseconds_t tv_usec; /* マイクロ秒 */ };
これにより紀元 (the Epoch: time(2) を参照) からの秒とマイクロ秒が取得できる。 tz 引き数は struct timezone である:
struct timezone { int tz_minuteswest; /* グリニッジ標準時との差 (西方に分単位) */ int tz_dsttime; /* 夏時間調整の型 */ };
tv や tz が NULL の場合、対応する構造体の設定/取得は行われない (ただし、tv が NULL の場合には、コンパイル時の警告が発生する)。
timezone 構造体の利用は廃止予定とされている; 通常は tz 引き数に NULL を指定すべきである (下記の「注意」を参照)。
Linux では、 settimeofday() システムコールに関連して、独特の「クロックのズレ (warp clock)」が存在する場合がある。 これは (ブート後の) 最初の呼び出しで tz 引き数が NULL でなく、 tv 引き数が NULL で tz_minuteswest フィールド が 0 でない場合に起こる (この場合 tz_dsttime フィールドは 0 にすべきである)。 このような場合、 settimeofday() は CMOS クロックが地方時 (local time) であり、 UTC システム時間を得るためには、tz_minuteswest の分だけ増加させなくてはなら ないとみなしてしまう。 疑いもなく、この機構を使うことは良い考えではない。
timeval 構造体を操作するためのマクロの説明は timeradd(3) にある。
昔は struct timeval のフィールドは long 型であった。
tz_dsttime は Linux でこれまで使われたことはない。 したがって、以下は純粋に歴史的な興味から書かれたものである。
tz_dsttime フィールドには (下記に示す) シンボル定数が格納される。 これは一年のうちでいつ夏時間 (Daylight Savings Time) を実施するかを示している (注意: その値は年間を通した定数である: 夏時間が実施中であることを示すわけではなく、 アルゴリズムを選択しているだけである)。 夏時間は以下のように定義される:
DST_NONE /* 夏時間を採用していない */
DST_USA /* アメリカ合衆国式夏時間 */
DST_AUST /* オーストラリア式夏時間 */
DST_WET /* 西ヨーロッパ式夏時間 */
DST_MET /* 中央ヨーロッパ式夏時間 */
DST_EET /* 東ヨーロッパ式夏時間 */
DST_CAN /* カナダ */
DST_GB /* グレートブリテンおよびアイルランド */
DST_RUM /* ルーマニア */
DST_TUR /* トルコ */
DST_AUSTALT /* 1986年に移行されたオーストラリア式 */
当然のことながら、夏時間がどの期間に実施されるかを国ごとの簡単なアルゴリズムで 導くことができないことが判明した。 実際、夏時間の期間は予測不可能な政治的決定で 決定される。そのため、この方法でタイムゾーンを表すことは断念された。 Linux において settimeofday() を呼び出すときは、 tz_dsttime フィールドを 0 にするべきである。