Linux システムで時間を取得して使用する方法

Linux システムで時間を取得して使用する方法

Linux システム時間には 2 種類あります。

(1)暦上の時刻。値は、指定された時刻、1970 年 1 月 1 日 00:00:00 (協定世界時 (UTC)) から経過した累積秒数です。基本的なデータ型は time_t を使用して保存されます。最後に、変換によって、通常表示される 24 時間または 12 時間の時間を取得できます。

(2)処理時間CPU 時間とも呼ばれ、プロセスによって使用される中央処理装置のリソースを測定します。プロセス時間はクロックティック単位で測定されます。

この記事では、Linux 時間の取得方法と使用方法について詳しく説明します。詳しい説明を見てみましょう。

タイムスタンプを取得

時間()

#include <time.h>
time_t 時間(time_t *calptr)
  • time は現在のタイムスタンプを返します。これは世界時刻から現在までの秒数です。
  • time_t は実際には uint64_t です。
  • calptr が空でない場合、タイムスタンプもポインタに書き込まれます。

呼び出し例:

#include <time.h>
#include <iostream>
#include <stdlib.h>

名前空間 std を使用します。

int メイン()
{
現在の時刻。
curTime = 時間(NULL);
cout << curTime << endl;
0を返します。
}

結果:

1533287924
のような値の文字列を返します。 1533287924

gettimeofday() と clock_gettime()

time 関数は秒単位の精度でのみ時刻を取得できます。より高精度のタイムスタンプを取得するには、他の関数が必要です。 gettimeofday 関数はマイクロ秒精度のタイムスタンプを取得し、timeval 構造体に保存できます。clock_gettime 関数はナノ秒精度のタイムスタンプを取得し、timespec 構造体に保存できます。

#include <sys/time.h>

int gettimeofday(構造体 timeval *tp, void *tzp);
歴史的な理由により、tzp の唯一の有効な値は NULL なので、呼び出すときに NULL と記述するだけです。

int clock_gettime(clockid_t clock_id, strcut timespec *tsp);
clock_id には複数のオプションがあります。CLOCK_REALTIME を選択した場合、機能は time に似ていますが、時間の精度が高くなります。

2 つの関数で使用される構造体は次のように定義されます。

構造体timeval
{
long tv_sec; /*秒*/
long tv_usec; ​​/*マイクロ秒*/
};

構造体タイムスペック
{
time_t tv_sec; //秒 long tv_nsec; //ナノ秒};

呼び出し例:

#include <time.h>
#include <sys/time.h>
#include <iostream>
#include <stdlib.h>

名前空間 std を使用します。

int メイン()
{
タイムスタンプ
dwCurTime1 = 時間(NULL);

構造体timeval stCurTime2;
gettimeofday(&stCurTime2, NULL);

構造体timespec stCurTime3;
clock_gettime(CLOCK_REALTIME、&stCurTime3);

cout << "Time1: " << dwCurTime1 << "s" << endl;
cout << "Time2: " << stCurTime2.tv_sec << "s, " << stCurTime2.tv_usec << "us" << endl;
cout << "Time3: " << stCurTime3.tv_sec << "s、" << stCurTime3.tv_nsec << "ns" << endl;

0を返します。
}

結果:

コンパイル時に、コンパイルコマンドの最後に-lrtを追加して、Real Timeダイナミックライブラリをリンクします。
g++ -o time2 test_time_linux_2.cpp -lrt

時間1: 1533289490秒
時間2: 1533289490秒、133547us
時間3: 1533289490秒、133550060ナノ秒

時間を視覚化する

tm構造

取得したタイムスタンプでは、現在の時刻を直感的に表示することはできません。そのため、日常生活で目にする時刻を表すには、tm 構造体を使用する必要があります。構造体は次のように定義されます。

構造体tm
{
int tm_sec; /*秒、通常の範囲は0〜59ですが、最大61まで許可されます*/
int tm_min; /*分、0-59*/
int tm_hour; /*時間、0-23*/
int tm_mday; /*日、つまり月の日、1~31*/
int tm_mon; /*1月から始まる月、0~11*/ 1+p->tm_mon;
int tm_year; /*年、1900年から何年経過したか*/ 1900+ p->tm_year;
int tm_wday; /*週、曜日、日曜日から始まる、0-6*/
int tm_yday; /*今年の1月1日から現在までの日数。範囲は0から365*/
int tm_isdst; /*夏時間フラグ*/
};

time_t から tm

gmtime と localtime は、time_t 型のタイムスタンプを tm 構造体に変換できます。使用方法は次のとおりです。

構造体 tm* gmtime(const time_t *timep);
//time_t で表される時間を、タイムゾーン変換なしで UTC 時間に変換します。これは、struct tm 構造体ポインターです。 stuct tm* localtime(const time_t *timep);
//gmtime と似ていますが、タイムゾーン変換後の時刻、つまり北京時間に変換できます。

固定フォーマット印刷時間

tm 構造体を取得したら、日常使用のために文字列形式に変換するか、time_t から直接変換することができます。この目的を達成するには、次の 2 つの関数を使用できます。ただし、これら 2 つの関数は、固定形式でのみ時間を印刷できます。

//これら 2 つの関数は非推奨としてマークされています。後で紹介する関数を使用するようにしてください。char *asctime(const struct tm* timeptr);
char *ctime(const time_t *timep);

呼び出し例:

#include <time.h>
#include <sys/time.h>
#include <iostream>
#include <stdlib.h>

名前空間 std を使用します。

int メイン()
{
タイムスタンプ
dwCurTime1 = 時間(NULL);

構造体 tm* pTime;
pTime = ローカルタイム(&dwCurTime1);

char* strTime1;
char* strTime2;
strTime1 = asctime(pTime);
strTime2 = ctime(&dwCurTime1);

cout << strTime1 << endl;
cout << strTime2 << endl;

0を返します。
}

結果:

2018年8月3日金曜日 18:24:29
2018年8月3日金曜日 18:24:29

柔軟で安全な時間変換関数 strftime()

上記の 2 つの関数は、バッファ オーバーフローの問題が発生する可能性があるため非推奨とされているため、より安全な方法は strftime メソッドを使用することです。

/*
** @buf: 出力時間を格納します ** @maxsize: バッファの最大バイト長 ** @format: 出力時間の形式を指定します ** @tmptr: 構造体 tm へのポインタ*/
size_t strftime(char* buf, size_t maxsize, const char *format, const struct tm *tmptr);

timeptr に格納されている時間情報を、format で指定された形式に従って、format が指す文字列内の形式に従って buf に出力し、バッファ buf に最大 maxsize 文字を格納できます。この関数は、buf が指す文字列に配置された文字数を返します。

strftime() 関数は sprintf() と似た動作をします。つまり、パーセント記号 (%) で始まる一連のフォーマット コマンドを認識し、出力を文字列にフォーマットします。 format コマンドは、文字列 strDest 内のさまざまな日付と時刻の情報の正確な表現を指定します。フォーマット文字列内の他の文字は変更されずに文字列に配置されます。フォーマット コマンドは以下にリストされており、大文字と小文字が区別されます。

%a 曜日の略語
%A 曜日のフルネーム
%b 月の略語
%B 月のフルネーム
%c 標準の日付と時刻の文字列
%C 年の下2桁
%d 月の日付を 10 進数で表したもの
%D 月/日/年
%e 2 文字のフィールドに 10 進数で表した月内の日
%F 年-月-日
%g 週ベースの年を使用した年の最後の2桁
%G 年(週ベースの年を使用)
%h 月名の省略形
%H 24時間形式の時間
%I 12時間形式の時間
%j 10進数表記の年間通算日
%m 10進数表記の月
%M 分(10 時間形式)
%n 改行文字
%p ロケールの AM または PM に相当するもの
%r 12時間
%R は時間と分を表示します: hh:mm
%S 10進秒
%t 水平タブ文字
%T は時間、分、秒を表示します: hh:mm:ss
%u 月曜日を初日とする曜日(0 から 6 までの値、月曜日を 0 とする)
%U 日曜日を初日とする年間の週番号(0~53の値)
%V 週ベースの年を使用した年間の週
%w 曜日を10進数で表したもの(0から6までの値、日曜日は0)
%W 月曜日を初日とする年間の週番号(0~53の値)
%x 標準日付文字列
%X 標準時間文字列
%y 世紀なしの10進年(0から99までの値)
%Y 世紀を含む十進年
%z、%Z タイムゾーン名。タイムゾーン名を取得できない場合は、空の文字が返されます。
%% パーセント記号

呼び出し例:

#include <time.h>
#include <sys/time.h>
#include <iostream>
#include <stdlib.h>

名前空間 std を使用します。

int メイン()
{
タイムスタンプ
dwCurTime1 = 時間(NULL);

構造体 tm* pTime;
pTime = ローカルタイム(&dwCurTime1);

char buf[100];

strftime(buf, 100, "時間: %r, %a %b %d, %Y", pTime);

cout << buf << endl;

0を返します。
}

結果:

時刻: 2018 年 8 月 3 日金曜日午後 8 時 18 分 12 秒

時間関数の関係のグラフ

処理時間

プロセス時間とは、プロセスが作成されてから CPU を使用する時間です。プロセス時間は次の 2 つの部分に分かれています。

  • ユーザーCPU時間: ユーザーモードでCPUを使用した時間
  • カーネル CPU 時間: カーネル モードで CPU を使用するのに費やされた時間。これは、カーネル呼び出しやその他の特別なタスクを実行するために必要な時間です。

時計機能

clock 関数は、プロセス時間を取得するためのシンプルなインターフェイスを提供します。プロセスによって使用された合計 CPU 時間 (ユーザー時間とカーネル時間を含む) を表す値を返します。関数は次のように定義されます。

#include <time.h>
clock_t クロック(void)
//エラーの場合は-1を返す

clock 関数は CLOCKS_PER_SEC 単位で値を返します。戻り値をこの単位で割ると、処理時間の秒数が得られます。

倍数関数

times 関数もプロセス時間関数であり、より具体的なプロセス時間表現を持ちます。関数の定義は次のとおりです。

#include <sys/times.h>
clock_t times(構造体tms* buf);

構造体tms{
tms_utime は、クロックを生成する。
tms_stime は、クロックの経過時間を表します。
クロックtms_cutime;
クロックtms_cstime;
};

times 関数の戻り値の型は引き続き clock_t ですが、戻り値の測定単位は clock 関数とは異なります。 times 関数の戻り値の測定単位は、sysconf (SC_CLK_TCK) を通じて取得できます。

Linux システム プログラミング マニュアルの完全な使用例は次のとおりです。

#include <time.h>
#include <sys/times.h>
#include <unistd.h>
#include <stdio.h>

静的 void displayProcessTime(const char* msg)
{
構造体tmst;
clock_t クロック時間;
静的ロングクロックティック = 0;

(メッセージ!= NULL)の場合 
{
printf("%s\n", メッセージ);
}

(クロックティック == 0)の場合
{
クロックティック = sysconf(_SC_CLK_TCK);
(clockTick < 0) の場合、戻り値:
}

クロックタイム = クロック();
printf("クロックは%ld CLOCKS_PER_SEC (%.2f 秒) を返します\n", (long)clockTime, (double)clockTime/CLOCKS_PER_SEC);

回(&t);
printf("times return user CPU = %.2f; system CPU = %.2f\n", (double)t.tms_utime / clockTick, (double)t.tms_stime / clockTick);
}

int メイン()
{
printf("CLOCKS_PER_SEC = %ld, sysconf(_SC_CLK_TCK) = %ld\n", (long)CLOCKS_PER_SEC, sysconf(_SC_CLK_TCK));

プロセス時間を表示します("開始:");
(int i = 0; i < 1000000000; ++i) の場合
{
pid を取得します。
}
printf("\n");
プロセス時間を表示します("終了:");

0を返します。
}

参照する

[1] http://www.runoob.com/w3cnote/cpp-time_t.html

[2] 上級Unixプログラミング環境(第3版)

[3] Unixシステムプログラミングマニュアル

要約する

上記はこの記事の全内容です。この記事の内容が皆さんの勉強や仕事に一定の参考学習価値を持つことを願っています。ご質問があれば、メッセージを残してコミュニケーションしてください。123WORDPRESS.COM を応援していただきありがとうございます。

以下もご興味があるかもしれません:
  • Windows と Linux で現在の時刻で名前が付けられたファイルを生成する方法
  • Linux での date コマンド、フォーマットされた出力、時刻設定方法
  • Linux での time 関数の解析: 時間の設定と取得の方法
  • Linux のバッチファイル削除コマンド (N 日前のファイルを削除)
  • Linuxはプロセス実行時間メソッドの例を取得します
  • プログラムでLinuxシステムの起動時間を取得する方法
  • Linuxベースの時刻取得機能の詳細説明
  • Linuxシステムの起動時間の例の詳細な説明
  • Linuxはファイルの変更時間とシステム時間の差を決定します
  • 時間とタイムスタンプに関する Linux/Unix コマンドライン

<<:  JS を使用して配列内の要素の存在を 10 分で判断する

>>:  MySQL で中国語を入力するときに発生するエラー 1366 の解決方法

推薦する

Jenkinsはマイクロサービスをパッケージ化してDockerイメージを構築し、実行します。

目次環境の準備始める1. GitLabリモートリポジトリがマイクロサービスプロジェクトを作成する2....

MySQL Null は 5 つの問題を引き起こす可能性があります (すべて致命的)

目次1. カウントデータが失われる解決2. 明確なデータ損失3.データ損失を選択解決4. Nullポ...

CSS 配送先住所平行四辺形線スタイルの例コード

コードは次のようになります。 // 配送先住所の平行四辺形の線のスタイル <view clas...

CSSは高度に適応したフルスクリーンを実現します

独自のデモを作成するときに、display:flex を使用して垂直方向の中央揃えを実現したいと思い...

Reactイベントバインディングの詳細な説明

1. 何ですかreactアプリケーションでは、イベント名はキャメルケース形式で記述されます。たとえ...

タブ切り替え機能を実装するJavaScriptカスタムプラグイン

この記事では、タブ切り替え機能を実装するためのJavaScriptの具体的なコードを参考までに共有し...

MySQL 5.7.18 zip バージョンのインストール チュートリアル

MySQL の mysql 5.7.18 zip バージョンは、クリックして次のステップをクリックし...

スケジュールされた時間に古いジャンクファイルを自動的に削除する Linux 用の Autotrash ツール

Autotrash は、古い削除済みファイルを消去するプロセスを自動化するコマンド ライン プログラ...

Linux で Ceph 分散ソフトウェアをインストールして使用する方法に関するチュートリアル

目次序文1. 基本環境1. サービス配信2. ネットワーク構成(全ノード) 3. SSHパスワードフ...

Vue はコンポーネント間の通信をどのように実装しますか?

目次1. 父と息子のコミュニケーション1.1 親コンポーネント --> 子コンポーネント1.2...

CSSの固定位置属性の詳細な説明

モバイル アプリを開発する場合、Web サイトが特定の高さまでスクロールしたときにコンテンツの一部を...

HTML で相対パスを使用してディレクトリのすべてのレベルのファイルを取得する方法の詳細な説明

相対パスの概念現在のファイルの場所を参照ポイントとして使用して、ターゲット ファイルへのパスを確立し...

Linuxのファイルとフォルダの権限を操作する方法

Linux のファイル権限まず、現在のディレクトリ内のファイルの内容を確認しましょう。 ls -l ...

JDBC 接続 (MySQL への接続) の 6 ステップのサンプル コード

JDBC の 6 つのステップ: 1. ドライバーを登録する2. データベース接続を取得する3. デ...

JavaScript でシンプルな Web 時計を実装する

JavaScript を使用して Web ページ クロックを実装します。効果は次の図に示されています...