lisz-works

プログラミングと興味を貴方に

【コピペでOK】C++で日時文字列を取得する方法!

【スポンサーリンク】

 プログラムのソースコード

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;

にするとか!

必要に応じてカスタマイズしましょう!

参考

コチラを参考にしました。ありがとうございました!

rinov.sakura.ne.jp

teramonagi.hatenablog.com

qiita.com

ja.cppreference.com

docs.microsoft.com

あとがき

C++で日時文字列を取得する方法についてでした!

今回地味に1番びっくりしたのは、C++での0詰めの方法でした。

C言語の方がよくやるので、どうも「<<」に慣れていないので

「こんな方法が……」

と、驚かされることが多々あります(笑)