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 の解決方法

推薦する

アイデアをDockerに接続してワンクリックでデプロイする方法

1. docker設定ファイルを変更し、ポート2375を開きます。 [root@s162 docke...

MySQL スロークエリログの詳細な理解

目次スロークエリログとは何ですか?スロークエリを有効にする方法ログ分析ツール mysqldumpsh...

Ubuntu 18.04はルート権限を取得し、ルートユーザーとしてログインします

事前に書いておきます:次の手順では、ターミナルにコマンドを入力する必要があります。コンピューターでブ...

vue2.x の徹底研究 - h 関数の説明

目次解決、要約: vue プロジェクト。 .vue ファイルのテンプレート内に記述されたコードは、w...

レスポンシブ Web をデザインするにはどうすればいいですか?レスポンシブウェブデザインのメリットとデメリット

最近レスポンシブ デザインについて学んでいて、これについていくつか整理してみました。写真の一部はイン...

Vueデータ監視の原理の詳細な説明

目次1. はじめにII. 監視対象2.1 なぜオブジェクトを監視する必要があるのですか? 2.2 デ...

Docker Swarm サービス オーケストレーション コマンドの詳細な説明

1. はじめにDocker には、タスクを構成する複数の Docker コンテナをオーケストレーショ...

Dockerコンテナ内でホストDocker操作を呼び出して実行する

まず、この投稿は Docker 初心者向けです。もちろん、ベテランであれば記事中の分割線以降の操作方...

HTMLとは何ですか?

HTML 開発の歴史: HTML は英語で Hypertext Marked Language の...

Vue は better-scroll を使用して水平スクロール方法の例を実現します

1. スクロールの実装原理better-scroll のスクロール原理は、ブラウザのネイティブスクロ...

Vueユーザーが長時間操作せずにログインページからログアウトするように実装する2つの方法

目次問題の説明フロントエンド制御(方法1)アイデアコードバックエンド制御(方法2)アイデアコード要約...

React Native が「NSArray<id<RCTBridgeModule>>型のパラメータを初期化できません」というエラーを報告する (解決方法)

最近、古い RN プロジェクトを Xcode で実行すると、次のコード エラーが報告されました。 &...

Docker ベースの nginx ファイル サーバーを構築する方法と手順

1. このマシンに新しい設定ファイルdocker_nginx.confを作成します。 サーバー{ 7...

MySQL でコミットされていないトランザクションを見つけるための SQL の例の簡単な分析

以前、「MySQL でコミットされていないトランザクション情報を検索する方法」というタイトルのブログ...

JavaScript における this ポイントの問題の詳細な説明

要約する地球環境 ➡️ ウィンドウ通常関数 ➡️ ウィンドウまたは未定義コンストラクター ➡️ 構築...