C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++で現在のシステム日時を取得・表示する方法


C++の標準ライブラリには、本格的な日付型が用意されていません。そのため、C++では日付や時刻を扱うための構造体や関数をC言語から引き継いで利用します。日付・時刻関連の関数や構造体を使うには、プログラムに<ctime>ヘッダーファイルをインクルードする必要があります。

時刻に関連する型は「clock_t」「time_t」「size_t」「tm」の4種類です。このうち clock_t、size_t、time_t の3つは、システムの日付と時刻を何らかの整数値として表現できます。

構造体型「tm」は、日付と時刻を以下のメンバーを持つC構造体として保持します。

struct tm {
    int tm_sec;   // 秒(0〜61)
    int tm_min;   // 分(0〜59)
    int tm_hour;  // 時(0〜24)
    int tm_mday;  // 日(1〜31)
    int tm_mon;   // 月(0〜11)
    int tm_year;  // 1900年からの経過年数
    int tm_wday;  // 日曜日からの経過日数
    int tm_yday;  // 1月1日からの経過日数
    int tm_isdst; // 夏時間かどうかを示すフラグ
}

現在日時を取得するサンプルコード

現在のシステム日時を、ローカル時刻として取得するか、協定世界時(UTC)として取得するかを選ぶことができます。以下は、両方の形式で現在日時を取得して表示する例です。

#include <iostream>
#include <ctime>
using namespace std;

int main() {
    // 現在のシステム時刻に基づく日付/時刻を取得
    time_t now = time(0);
    char* dt = ctime(&now); // now を文字列形式に変換
    cout << "The local date and time is: " << dt << endl;

    // UTC用に now を tm 構造体へ変換
    tm *gmtm = gmtime(&now);
    dt = asctime(gmtm);
    cout << "The UTC date and time is:" << dt << endl;
}

実行結果

The local date and time is: Fri Mar 22 13:07:39 2019
The UTC date and time is:Fri Mar 22 07:37:39 2019

使用している主な関数

  • time():現在のカレンダー時刻を time_t 型の値として取得します。
  • ctime():time_t 型の値を読みやすい文字列形式に変換します。
  • gmtime():time_t 型の値をUTC基準の tm 構造体に変換します。
  • asctime():tm 構造体を文字列形式に変換します。

なお、ローカルタイムゾーンの時刻を tm 構造体として取得したい場合は、gmtime() の代わりに localtime() 関数を使用してください。これにより、システムに設定されたタイムゾーンに応じた日時を扱えます。

  1. C/C++で実装するバークレーアルゴリズム――分散システムの時刻同期を徹底解説

    バークレーアルゴリズムとは バークレーアルゴリズム(Berkeleys Algorithm)は、分散システムにおいて各ノードの時計を同期させるために用いられるアルゴリズムです。特に、以下のような状況にあるシステムで有効とされています。 マシンに正確な時刻源が存在しない場合 ネットワークやマシンにUTCサーバーが用意されていない場合 分散システムとは、物理的に離れた場所に配置された複数のノードが、ネットワークを介して相互に接続されたシステムのことを指します。各ノードの時計は独立して動作しているため、誤差が生じやすく、何らかの同期機構が必要になります。 バークレーアルゴリズムの仕組み このア

  2. C++で二分木を見やすい形式で2次元配列に出力する方法

    本記事では、二分木(バイナリツリー)を m×n の2次元文字列配列として整形して出力する方法を解説します。出力には以下のルールが適用されます。行数 m は、与えられた二分木の高さと一致すること。列数 n は、必ず奇数になること。ルートノードの値は、最初の行のちょうど中央に配置する。ルートノードが存在する行と列によって、残りの領域は「左下」と「右下」の2つの部分に分割される。左側の部分木は左下の領域へ、右側の部分木は右下の領域へそれぞれ出力する。左右の領域は同じサイズとする。片方の部分木が存在しない場合でも、何も出力はしないものの、もう一方の部分木と同じサイズの領域は確保しておく必要がある。ただ