あなたは間違って理解しています。 settimeofday(2) はエポック時間を設定しています。これは日付と時刻の両方です。読み取り時間(7)
したがって、日付を表す文字列から開始する場合は、その文字列を strptime(3) で struct tm
に変換します それを mktime(3) で Unix 時間に変換し、それを settimeofday
にフィードします。 (つまり、tv_sec
フィールド)
ただし、settimeofday
ルート権限が必要であり、通常は呼び出すことを避けるべきだと思います(少なくとも通常のインターネットに接続されたコンピューターでは)。 Linux PC で NTP クライアント サービスを設定することをお勧めします (たとえば、ntpd または chrony を実行し、より一般的には、時間の管理に関する sysadmin の章を読んでください...)。 adjtimex(2)も参照
ところで、マルチタスキング システム (Linux や Windows など) でシステム時刻を突然変更することは非常に危険な操作です (時刻に応じて、または時刻を使用して多くのシステム タスクを混乱させ、妨害するため)。これを行う正当な理由はほとんどありません (一般的に非常に悪い考えです)。それを行う場合は、実行中のプログラムとサービスをほとんど使用しないでください (シングル ユーザー モードの Linux など)。通常のアプリケーション コードでこれを行うべきではありません。
Linux で日付と時刻を設定するために、このコードを書きます。
#include <time.h>
struct tm time = { 0 };
time.tm_year = Year - 1900;
time.tm_mon = Month - 1;
time.tm_mday = Day;
time.tm_hour = Hour;
time.tm_min = Minute;
time.tm_sec = Second;
if (time.tm_year < 0)
{
time.tm_year = 0;
}
time_t t = mktime(&time);
if (t != (time_t) -1)
{
stime(&t);
}
stime
に注意してください root
が必要です