#include <sys/time.h>
[[deprecated]]
int gettimeofday(struct timeval *restrict tv,
struct timezone *_Nullable restrict tz);
[[deprecated]]
int settimeofday(const struct timeval *tv,
const struct timezone *_Nullable tz);
glibc 向けの機能検査マクロの要件 (feature_test_macros(7) 参照):
settimeofday():
glibc 2.19 よりあと:
_DEFAULT_SOURCE
glibc 2.19 以前:
_BSD_SOURCE
tv 引数は struct timeval(<sys/time.h>で定義)です:
struct timeval {
time_t tv_sec; /* 秒 */
suseconds_t tv_usec; /* マイクロ秒 */
};
これにより紀元 (the Epoch: time(2) を参照) からの秒とマイクロ秒が取得できます。
The 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 の分だけ増加させなくてはならないとみなしてしまいます。 疑いもなく、この機構を使うことは良い考えではありません。
カーネルは tv と tz の両方に対して NULL を受け付けます。timezone 引数は glibc と muslでは無視され、カーネルとの間で渡されません。Android の bionic は timezone 引数をカーネルとの間で渡しますが、Android は設定のデバイスタイムゾーンに基づいてカーネルタイムゾーンを更新しないので、カーネルのタイムゾーンは通常 UTC です。
昔は struct timeval のフィールドは long 型でした。
tz_dsttime フィールドには (下記に示す) シンボル定数が格納されます。これは一年のうちでいつ夏時間 (Daylight Savings Time) を実施するかを示しています(注意: その値は年間を通した定数です: 夏時間が実施中であることを示すわけではなく、アルゴリズムを選択しているだけです)。夏時間は以下のように定義されます:
DST_NONE /* not on DST */ DST_USA /* USA style DST */ DST_AUST /* Australian style DST */ DST_WET /* Western European DST */ DST_MET /* Middle European DST */ DST_EET /* Eastern European DST */ DST_CAN /* Canada */ DST_GB /* Great Britain and Eire */ DST_RUM /* Romania */ DST_TUR /* Turkey */ DST_AUSTALT /* Australian style with shift in 1986 */
もちろん、夏時間が適用される期間は、国ごとに 1つの単純なアルゴリズムでは与えられないことがわかりました。実際、この期間は予測不可能な政治的決定によって決定されます。そのため、このタイムゾーンの表現方法は放棄されました。
timeval 構造体を操作するためのマクロの説明は timeradd(3) にあります。