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() 関数を使用してください。これにより、システムに設定されたタイムゾーンに応じた日時を扱えます。
-
C/C++で実装するバークレーアルゴリズム――分散システムの時刻同期を徹底解説
バークレーアルゴリズムとは バークレーアルゴリズム(Berkeleys Algorithm)は、分散システムにおいて各ノードの時計を同期させるために用いられるアルゴリズムです。特に、以下のような状況にあるシステムで有効とされています。 マシンに正確な時刻源が存在しない場合 ネットワークやマシンにUTCサーバーが用意されていない場合 分散システムとは、物理的に離れた場所に配置された複数のノードが、ネットワークを介して相互に接続されたシステムのことを指します。各ノードの時計は独立して動作しているため、誤差が生じやすく、何らかの同期機構が必要になります。 バークレーアルゴリズムの仕組み このア
-
C++で二分木を見やすい形式で2次元配列に出力する方法
本記事では、二分木(バイナリツリー)を m×n の2次元文字列配列として整形して出力する方法を解説します。出力には以下のルールが適用されます。行数 m は、与えられた二分木の高さと一致すること。列数 n は、必ず奇数になること。ルートノードの値は、最初の行のちょうど中央に配置する。ルートノードが存在する行と列によって、残りの領域は「左下」と「右下」の2つの部分に分割される。左側の部分木は左下の領域へ、右側の部分木は右下の領域へそれぞれ出力する。左右の領域は同じサイズとする。片方の部分木が存在しない場合でも、何も出力はしないものの、もう一方の部分木と同じサイズの領域は確保しておく必要がある。ただ