タイムスタンプ作成方法のひとつ
タイムスタンプを作成するときは、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で使用。
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