C++ でシステム時刻を出力する
- 
          
            C++ で std::chrono::system_clockとstd::ctimeを使用してシステム時刻を出力する
- 
          
            C++ で time、localtimeおよびstrftimeを使用してシステム時刻を出力する
 
この記事では、C++ でシステム時刻を出力する方法のいくつかの方法について説明します。
C++ で std::chrono::system_clock と std::ctime を使用してシステム時刻を出力する
    
std::chrono::system_clock はシステム全体の壁時計を表し、std::time_t タイプとの間で変換する 2つの関数を提供します。後者のオブジェクトは、ctime 関数を使用して処理し、null で終了する文字列を返すことができます-Wed Jun 30 21:49:08 1993\n。この場合、両方の呼び出しをカプセル化し、呼び出し元に string 値を返す別の関数を作成します。より柔軟な形式で値を返すために、改行文字も削除していることに注意してください。また、system_clock::now は、現在の時点を取得するために使用されます。
#include <sys/time.h>
#include <chrono>
#include <ctime>
#include <iostream>
using std::cout;
using std::endl;
using std::string;
std::string timeToString(std::chrono::system_clock::time_point &t) {
  std::time_t time = std::chrono::system_clock::to_time_t(t);
  std::string time_str = std::ctime(&time);
  time_str.resize(time_str.size() - 1);
  return time_str;
}
int main() {
  auto time_p = std::chrono::system_clock::now();
  cout << "Current time: " << timeToString(time_p) << endl;
  return EXIT_SUCCESS;
}
出力:
Current time: Fri Apr  1 01:34:20 2021
次の例に示すように、同じ方法を使用して、エポック値を同様の形式で表示することもできます。エポックは通常、POSIX/UNIX システムでは 1970 年 1 月 1 日ですが、クロノライブラリで提供される異なるクロックで同じ値である必要はありません。
#include <sys/time.h>
#include <chrono>
#include <ctime>
#include <iostream>
using std::cout;
using std::endl;
using std::string;
std::string timeToString(std::chrono::system_clock::time_point &t) {
  std::time_t time = std::chrono::system_clock::to_time_t(t);
  std::string time_str = std::ctime(&time);
  time_str.resize(time_str.size() - 1);
  return time_str;
}
int main() {
  std::chrono::system_clock::time_point time_p2;
  cout << "Epoch: " << timeToString(time_p2) << endl;
  return EXIT_SUCCESS;
}
出力:
Epoch: Thu Jan  1 00:00:00 1970
C++ で time、localtime および strftime を使用してシステム時刻を出力する
または、POSIX 固有の関数である time を使用して、time_t 構造を直接取得することもできます。time_t は基本的に、エポックからの秒数を格納する整数です。前の方法と同様に、ctime を使用して事前定義された形式の文字列に変換するか、localtime 関数を呼び出すことができます。localtime 関数は、time_t オブジェクトを tm 構造に変換します。これは、特別な指定子を使用して出力文字列をフォーマットするために使用できる分解された時間フォーマットです。フォーマットは、4つのパラメーターを受け取る strftime 関数によって実行されます。最後のパラメーターは struct tm へのポインターです。最初の引数は文字列が格納されるメモリアドレスを指定し、次の 2つの引数は文字列の最大サイズとフォーマット指定子です。フォーマット仕様の詳細な概要は、このページで見ることができます。
#include <sys/time.h>
#include <ctime>
#include <iostream>
using std::cout;
using std::endl;
using std::string;
int main() {
  char tt[100];
  time_t now = time(nullptr);
  auto tm_info = localtime(&now);
  strftime(tt, 100, "%Y-%m-%d %H:%M:%S", tm_info);
  puts(tt);
  return EXIT_SUCCESS;
}
出力:
2021-04-02 05:42:46
