C++
MFC

String型タイムスタンプ作成方法(MFC版)

タイムスタンプ作成方法のひとつ

 タイムスタンプを作成するときは、time_tを使うのが通常かと思いますが、MFCの場合、unsafeだというエラーでコンパイルできなかった。セキュリティー強化型を使う必要があるのだろうか。
 
 MSDNには以下のような説明がされている。

多くの旧来の CRT 関数に、新しくセキュリティが強化されたバージョンができました。 セキュリティが強化された関数が存在する場合、セキュリティが弱い古いバージョンは推奨されないバージョンとしてマークされ、新しいバージョンには _s ("secure") のサフィックスが付いています。

ここで、"推奨されない" とは、その関数が CRT から削除される予定だということではありません。

また、セキュリティが強化された関数は、セキュリティ エラーを防止したり訂正したりするのではなく、エラー発生時にそのエラーをキャッチします。 これらの関数はエラー条件をチェックし、エラーが発生した場合に、エラー ハンドラーを呼び出します (「パラメーターの検証」を参照)。

 また、CTimeの場合、現在時刻を取得するGetCurrentTimeのメンバーファンクションが使用できなかった。原因がわからないので、__time64_t を使用して作成できた。__time32_tもあるが年数制限が近いので、3000年まで利用可能な64を使用する。この場合、上記のMSDNの説明にもあるように_s(サフィックス)のついた関数を使うのが正しいようだ。

 このプログラム上で使いやすいString型に変換してありますが、int型のまま使用する場合はコード内の下半分、String以下は必要ありません。

必須ヘッダー
<time.h>

以下は必要に応じて追加する。
<iomanip> は std::setw() や std::setfill()で使用。
<sstream> は stringstreamで使用。

timeStruct
std::string MFC_Fucntion::timeStamp() {

    struct tm timeStruct;
    __time64_t time64;
    errno_t err;

    _time64(&time64);
    err = _localtime64_s(&timeStruct, &time64);
    if (err) {
        exit(1);
    }

    std::string times;
    std::stringstream sst;
    sst <<  
        timeStruct.tm_year + 1900
        << std::setw(2) << std::setfill('0') << timeStruct.tm_mon + 1
        << std::setw(2) << std::setfill('0') << timeStruct.tm_mday
        << std::setw(2) << std::setfill('0') << timeStruct.tm_hour
        << std::setw(2) << std::setfill('0') << timeStruct.tm_min
        << std::setw(2) << std::setfill('0') << timeStruct.tm_sec;
    times = sst.str();
    return times;

}

アウトプット
20170721141845