LoginSignup
0
0

More than 5 years have passed since last update.

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

Posted at

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

 タイムスタンプを作成するときは、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

0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0