C++で日時文字列を取得する方法についてです!
ログファイルなどに日時を付与するときに役立ちます!
日時文字列(YYYYMMDDhhmmss)取得する関数
「YYYYMMDDhhmmss」形式で日時の文字列を取得します。
#include <iostream> #include <iomanip> string getDatetimeStr() { time_t t = time(nullptr); const tm* localTime = localtime(&t); std::stringstream s; s << localTime->tm_year + 1900; // setw(),setfill()で0詰め s << setw(2) << setfill('0') << localTime->tm_mon + 1; s << setw(2) << setfill('0') << localTime->tm_mday; s << setw(2) << setfill('0') << localTime->tm_hour; s << setw(2) << setfill('0') << localTime->tm_min; s << setw(2) << setfill('0') << localTime->tm_sec; // std::stringにして値を返す return s.str(); }
※年の処理をコメントを元に修正しました。
参考ページでは
#include <sstream>
をインクルードしていましたが、
#include <iostream>
でよいようです。
日時を取得
日時の取得は、localtime()で取得した、tm構造体から取得します。
tm構造体は、下記構成となっています。
変数は用途順にソートしました。
型 | 変数名 | 内容 |
---|---|---|
int | tm_year | 年:年 (実際の西暦から 1900 を引いた数) |
int | tm_mon | 月:[0-11] |
int | tm_mday | 日:[1-31] |
int | tm_hour | 時:[0-23] |
int | tm_min | 分:[0-59] |
int | tm_sec | 秒:[0-60] |
int | tm_wday | 曜日:[0-6] |
int | tm_yday | 年内通し日数:[0-365] |
int | tm_isdst | 夏時間フラグ(詳細略) |
0詰めがいらない!という場合(YYYYMDhms)
「YYYYMDhms」形式で日時の文字列を取得したい!という場合
s << setw(2) << setfill('0') << localTime->tm_xxx;
の
setw(2) << setfill('0')
を削除すればOKです!
つまり
string getDatetimeStr() { time_t t = time(nullptr); const tm* localTime = localtime(&t); std::stringstream s; s << "20" << localTime->tm_year - 100; s << localTime->tm_mon + 1; s << localTime->tm_mday; s << localTime->tm_hour; s << localTime->tm_min; s << localTime->tm_sec; // std::stringにして値を返す return s.str(); }
日時の形式をカスタマイズしたい!
単純にこの箇所をカスタマイズすればOKです!
s << "20" << localTime->tm_year - 100; // setw(),setfill()で0詰め s << setw(2) << setfill('0') << localTime->tm_mon + 1; s << setw(2) << setfill('0') << localTime->tm_mday; s << setw(2) << setfill('0') << localTime->tm_hour; s << setw(2) << setfill('0') << localTime->tm_min; s << setw(2) << setfill('0') << localTime->tm_sec;
例えば「20XX年」は「XX年」でいい!とかなら
s << "20" << localTime->tm_year - 100;
から
s << localTime->tm_year - 100;
にするとか!
必要に応じてカスタマイズしましょう!
参考
コチラを参考にしました。ありがとうございました!
あとがき
C++で日時文字列を取得する方法についてでした!
今回地味に1番びっくりしたのは、C++での0詰めの方法でした。
C言語の方がよくやるので、どうも「<<」に慣れていないので
「こんな方法が……」
と、驚かされることが多々あります(笑)