C#のDateTimeとC++のtime_tを相互変換する

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
}

短いですが以上です。