[C++]今の日時を取得

はじめに

 今の日付と時刻を知りたいとおもったことはありませんか。いくつか方法を記載します。
 ユーザー定義の変数名は日本語にしています。メリハリがあるとコードが読みやすいかなぁとおもったので。
 サンプルでは『using namespace std;』を省略していますので、コードを試すときはこの行をおぎなってください。

経過秒』を time_t 形式で取得

 とりあえず time_t 形式にします。これは『1970/01/01 00:00:00 UTC からの経過秒』です。
 32ビットシステムでは 2038/01/19 03:14:07 まで表現できるそうです。もうすぐトラブルが発生しそうな予感がしますね。64ビットシステムへの移行が必要です。

now()を使う方法

#include <chrono>
chrono::system_clock::time_point 日時 = chrono::system_clock::now();
time_t 経過秒 = chrono::system_clock::to_time_t(日時);

time(nullptr)を使う方法

#include <chrono>
time_t 経過秒 = time(nullptr);

 『nullptr』を使うことが推奨されているようですが、かわりに『NULL』や『0』を使うこともできます。

構造体 tm 形式へ変換

 先ほど求めた経過秒(time_t)を今の日時 (struct tm) にします。今の日時といっても色々ありますが、協定世界時 (UTC,GMT) へ変換するものと、現地時間(ローカルタイム)へ変換するものを記載します。

協定世界時へ

struct tm 今の日時;
gmtime_s(&今の日時, &経過秒);

現地時間(日本時間)へ

struct tm 今の日時;
localtime_s(&今の日時, &経過秒);

今の日時 (struct tm) を文字の日時 (char[])へ

 今の日時を文字として整形してみましょう。日付の文字列は国によって異なりますが、今回は日本の形式にします。
 ・日本 : //日
 ・イギリス : 日//
 ・アメリカ : /日/
 国によって日付の並び順が異なりますが、何だか話す順番に通じるものがあるような気がします。

char型の『年/月/日 時:分:秒』へ

char 文字の日時[128];
strftime(文字の日時, 128, "%Y/%m/%d %H:%M:%S", &今の日時);

 char[128] では sizeof(char[128]) が128になります。strftime(文字の日時, sizeof(文字の日時), … としても大丈夫そうです。

wchar_t型の『年/月/日 時:分:秒』へ

wchar_t 文字の日時[128];
wcsftime(文字の日時, 128, L"%Y/%m/%d %H:%M:%S", &今の日時);

 wchar_t[128] では sizeof(wchar_t[128]) が 256 になります。wcsftime(文字の日時, sizeof(文字の日時), … とはできませんね。

さいごに

 コード全体を書いてみましょう。

#include <chrono>
using namespace std;
time_t 経過秒 = time(nullptr);
struct tm 今の日時;
localtime_s(&今の日時, &経過秒);
char 文字の日時[128];
strftime(文字の日時, 128, "%Y/%m/%d %H:%M:%S", &今の日時);
cout << "今は " << 文字の日時 << endl;
おすすめ