C++/CLIやC#とネイティブを相互運用を使用しているときにC#のDateTime型とC++のtime_tを相互に変換する方法です。
コードのかりやすさ優先でまとめています。
C#のDateTime → C++のtime_tへの変換
.NETのDateTimeをtime_tに変換します。
tm型を経由してmktimeを使ってtime_tへ変換します。
#include <ctime> // C#のDateTime → C++のtime_t への変換 time_t to_time_t(DateTime manage_date_time) { struct tm nTime { manage_date_time.Second, manage_date_time.Minute, manage_date_time.Hour, manage_date_time.Day, manage_date_time.Month - 1, // 0~11 → 1~12 manage_date_time.Year - 1900 }; return std::mktime(&nTime); }
C++のtime_t → C#のDateTimeへの変換
time_tから.NETのDateTimeに変換します。
#include <ctime> // C++のtime_t → C#のDateTimeへの変換 DateTime to_DateTime(time_t native_time) { struct tm* nTime = std::localtime(&native_time); return System::DateTime(nTime->tm_year + 1900, nTime->tm_mon + 1, nTime->tm_mday, nTime->tm_hour, nTime->tm_min, nTime->tm_sec); }
動作確認
上記の関数のを使った時の動作確認です。
#include <ctime> #include <stdio.h> void test() { // ★DateTime → time_tの確認 auto manage_date_time = System::DateTime::Now; time_t native_time = to_time_t(manage_date_time); // tmに戻してtime_tの時刻を取得 struct tm* nTime_after = std::localtime(&native_time); printf("%04d/%02d/%02d %02d:%02d:%02d\n", nTime_after->tm_year + 1900, nTime_after->tm_mon + 1, // 0~11 → 1~12 nTime_after->tm_mday, nTime_after->tm_hour, nTime_after->tm_min, nTime_after->tm_sec); //> 2019/11/05 23:10:11 // ★time_t → DateTimeの確認 time_t native_time = std::time(nullptr); System::DateTime manage_date_time = to_DateTime(native_time); // ToStringで結果を得る System::Console::WriteLine(manage_date_time.ToString("yyyy/MM/dd HH:mm:ss.fff")); // > 2019/11/05 23:10:11.000 }
短いですが以上です。