はじめに
今の日付と時刻を知りたいとおもったことはありませんか。いくつか方法を記載します。
ユーザー定義の変数名は日本語にしています。メリハリがあるとコードが読みやすいかなぁとおもったので。
サンプルでは『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;