1

我有一个由刻度数表示的时间戳值。通过创建一个新的 System.DateTime 对象并将时间戳值传递给构造函数,在 c# 下从它获取日期/时间很容易,或者我被告知(它是在 c# 中创建的)。问题是我只能使用 C/C++。即使将刻度转换为秒也有些令人困惑。根据 cplusplus.com 与宏 CLOCKS_PER_SEC 的简单乘法 - 每秒时钟滴答声就足够了。这导致乘以 1000。然而,根据 Microsoft 网站,到秒的转换因子应该是 1e7。要转换的样本值为634400640022968750,这表明第二个版本更接近现实。

我不会花时间描述我失败的尝试,因为它们让我无处可去。任何帮助将不胜感激。

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"库:如何在 C++ 中获取当前时间和日期?

于 2012-10-18T09:00:30.840 回答