1

ティック数で表されるタイムスタンプの値を取得しました。c# で日付/時刻を取得するには、新しい System.DateTime オブジェクトを作成し、タイムスタンプ値をコンストラクターに渡すことで簡単に取得できます (c# で作成されたものです)。問題は、C/C++ しか使用できないことです。ティックを秒に変換することさえ、やや混乱します。cplusplus.com によると、マクロ CLOCKS_PER_SEC による単純な乗算 - 1 秒あたりのクロック数で十分です。これにより、1000 が乗算されます。ただし、Microsoft の Web サイトによると、秒への変換係数は 1e7 である必要があります。変換されるサンプル値は 634400640022968750 であり、2 番目のバージョンが現実に近いことを示唆しています。

失敗した試みについては説明しません。どんな助けでも大歓迎です。

4

2 に答える 2

2

あなたがWindowsを使用していると仮定すると、問題はc#DateTimeが0001年1月1日に始まり、c ++ FILETIMEが1601年1月1日に始まるため、C#値でSYSTEMTIMEを取得するには、次のようなものが必要です...

    ULARGE_INTEGER uliTime;
    uliTime.QuadPart = 634400640022968750; // Your sample value

    SYSTEMTIME stSytemTime;
    memset(&stSytemTime,0,sizeof(SYSTEMTIME));

    FILETIME stFileTime;
    memset(&stFileTime,0,sizeof(FILETIME));

    // Fill FILETIME with your value
    stFileTime.dwLowDateTime = uliTime.LowPart;
    stFileTime.dwHighDateTime = uliTime.HighPart;

    // Convert FILETIME so SYSTEMTIME
    FileTimeToSystemTime(&stFileTime, &stSytemTime);
    stSytemTime.wYear -= 1600; // Remove the "start" diference

SYSTEMTIME を time_t に変換する

void ConvertSystemTimeToTimeT(const SYSTEMTIME &stSystemTime, time_t &stTimeT)
{
    // time_t min value is 1 January 1970
    LARGE_INTEGER liJanuary1970 = {0};
    liJanuary1970.QuadPart = 116444736000000000;

    FILETIME stFileTime = {0};    
    SystemTimeToFileTime(&stSystemTime, &stFileTime);

    ULARGE_INTEGER ullConverter;
    ullConverter.LowPart = stFileTime.dwLowDateTime;
    ullConverter.HighPart = stFileTime.dwHighDateTime;

    // time_t resolution is 1 second, FILETIME is 100 nanoseconds, so convert to seconds and remove the 1970 value  
    stTimeT = (time_t)(ullConverter.QuadPart - liJanuary1970.QuadPart) / 10000000;
}
于 2012-10-18T09:28:11.630 に答える
0

コードの時間を計りたい場合は、ハードウェアでサポートされている場合は、 QueryPerformance ライブラリ(QueryPerformanceFrequencyおよびQueryPerformanceCounter特に関数) を使用することをお勧めします。

エポックからの秒単位のタイムスタンプが必要な場合は、"time.h"ライブラリを使用してください: How to get current time and date in C++?

于 2012-10-18T09:00:30.840 に答える