gettimeofday

Section: System Calls (2)
Updated: 2026-02-08
Index JM Home Page roff page
 

名前

gettimeofday, settimeofday - 時刻を取得/設定する  

ライブラリ

標準 C ライブラリ (libc-lc)  

書式

#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
 

説明

関数 gettimeofday() と settimeofday() は時刻とタイムゾーンを取得または設定します。

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;         /* 夏時間調整の型 */
};

tvtz が 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 の分だけ増加させなくてはならないとみなしてしまいます。 疑いもなく、この機構を使うことは良い考えではありません。  

返り値

成功すると、 gettimeofday() と settimeofday() は 0 を返します。 エラーの場合、 -1 を返し、 errno にエラーを示す値を設定します。  

エラー

EFAULT
tvtz のどちらかがアクセス可能なアドレス空間外を指しています。
EINVAL
(settimeofday()): timezone が無効です。
EINVAL
(settimeofday()): tv.tv_sec が負または tv.tv_usec が [0, 999,999] の範囲外です。
EINVAL (Linux 4.3 以降)
(settimeofday()): 時間を CLOCK_MONOTONIC クロックの現在の値よりも小さい値に設定しようとしました (clock_gettime(2) を参照)。
EPERM
呼び出し元プロセスに settimeofday() を呼び出すための十分な特権がありません。 Linux では CAP_SYS_TIME ケーパビリティ (capability) が必要です。
 

バージョン

 

C ライブラリ/kernel の違い

いくつかのアーキテクチャでは、gettimeofday() の実装は vdso(7) で提供されています。

カーネルは tvtz の両方に対して NULL を受け付けます。timezone 引数は glibc と muslでは無視され、カーネルとの間で渡されません。Android の bionic は timezone 引数をカーネルとの間で渡しますが、Android は設定のデバイスタイムゾーンに基づいてカーネルタイムゾーンを更新しないので、カーネルのタイムゾーンは通常 UTC です。  

標準

なし。  

履歴

4.3 BSD,SVr4. SUSv1 と POSIX.1-2001 XSI は gettimeofday() を記述しましたが、settimeofday() は記述しませんでした。POSIX.1-2008 XSI は gettimeofday() を廃止としてマークし、代わりに clock_gettime(2) の使用を推奨しました。同様に、 settimeofday() の代わりに clock_settime(2) を使用すべきです。POSIX.1-2024 は gettimeofday() を削除しました。

昔は struct timeval のフィールドは long 型でした。  

tz_dsttime フィールド

Linux 以外のカーネルで、glibc では struct timezonetz_dsttime フィールドは、現在のタイムゾーンに夏時間規則が適用されたことがあるか、適用される予定であれば、gettimeofday() によってゼロ以外の値に設定されます。この意味では、現在のタイムゾーンに対するdaylight(3) の意味を正確に反映しています。Linuxでは、glibc では struct timezonetz_dsttime フィールド""の設定は、settimeofday() または gettimeofday() によって使用されたことはありません。これは libc や glibc ではサポートされておらず、今後もサポートされません。カーネルソースでこのフィールドが(宣言を除いて)発生するのはすべてバグです。したがって、以下は純粋に歴史的な関心事です。

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つの単純なアルゴリズムでは与えられないことがわかりました。実際、この期間は予測不可能な政治的決定によって決定されます。そのため、このタイムゾーンの表現方法は放棄されました。  

注意

gettimeofday() が返す時刻は、システム時間の不連続な変化(たとえば、システム管理者がシステム時間を手動で変更した場合など)の影響を受けます。単調増加するクロックが必要な場合は、clock_gettime(2) を参照してください。

timeval 構造体を操作するためのマクロの説明は timeradd(3) にあります。  

関連項目


 date(1), adjtimex(2), clock_gettime(2), time(2), ctime(3), ftime(3), timeradd(3), capabilities(7), time(7), vdso(7), hwclock(8)


 

Index

名前
ライブラリ
書式
説明
返り値
エラー
バージョン
C ライブラリ/kernel の違い
標準
履歴
tz_dsttime フィールド
注意
関連項目

This document was created by man2html, using the manual pages.