Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从SYSTEMTIME到time的转换\u t以UTC/GMT表示时间_C++_C_Visual C++_Time_Mfc - Fatal编程技术网

C++ 从SYSTEMTIME到time的转换\u t以UTC/GMT表示时间

C++ 从SYSTEMTIME到time的转换\u t以UTC/GMT表示时间,c++,c,visual-c++,time,mfc,C++,C,Visual C++,Time,Mfc,我试图通过在各种论坛中找到的实现,将SYSTEMTIME转换为time\t time_t TimeFromSystemTime(const SYSTEMTIME * pTime) { struct tm tm; memset(&tm, 0, sizeof(tm)); tm.tm_year = pTime->wYear - 1900; // EDIT 2 : 1900's Offset as per comment tm.tm_mon = pTime

我试图通过在各种论坛中找到的实现,将
SYSTEMTIME
转换为
time\t

time_t TimeFromSystemTime(const SYSTEMTIME * pTime)
{
    struct tm tm;
    memset(&tm, 0, sizeof(tm));

    tm.tm_year = pTime->wYear - 1900; // EDIT 2 : 1900's Offset as per comment
    tm.tm_mon = pTime->wMonth - 1;
    tm.tm_mday = pTime->wDay;

    tm.tm_hour = pTime->wHour;
    tm.tm_min = pTime->wMinute;
    tm.tm_sec = pTime->wSecond;
    tm.tm_isdst = -1; // Edit 2: Added as per comment

    return mktime(&tm);
}
但令我惊讶的是,
tm
携带的数据对应于本地时间,而
mktime()
返回的
time\u t
对应于UTC时间

是这样的还是我遗漏了什么

提前谢谢你的帮助

编辑1:我想将携带我的本地时间的
SYSTEMTIME
准确地转换为
时间

我在基于VC6的MFC应用程序中使用它


编辑2:修改代码。

我终于通过和从Windows SDK找到了解决方案

time\t GetLocaleDateTime(time\t ttdateTime)//来自mktime()的时间作为参数提供给这里
{
如果(ttdateTime 12*3600)?(iTz-24*3600):iTz;//14=>-10
iTz=(iTz<-11*3600)?(iTz+24*3600):iTz;//-14=>10
ttdateTime+=iTz;
返回ttdateTime;
}
编辑1
请添加您的评论,如果您看到任何错误,请随时评论或编辑。谢谢。

是的,手册上说mktime()将本地时间转换为UTC时间。根据time_t的要求,它存储自1970年1月1日12时UTC以来的秒数。功能,而不是bug。使用_mkgmtime(),它只在两者之间进行转换,而不将时区计入帐户。您的解释有些混乱:SYSTEMTIME包含什么?本地时间或UTC时间?系统时间始终是本地时间。然后,
mktime
做您想要做的事情,但有两个警告:C库的时区概念必须与系统的时区概念同步,
tm
结构中的
tm_isdst
标志必须正确设置。检查
SYSTEMTIME
结构中是否存在类似字段。
time_t GetLocaleDateTime( time_t ttdateTime) // The time_t from the mktime() is fed here as the Parameter
{
    if(ttdateTime <= 0)
        return 0;

    TIME_ZONE_INFORMATION tzi;

    GetTimeZoneInformation(&tzi); // We can also use the StandardBias of the TIME_ZONE_INFORMATION

    int iTz = -_timezone; // Current Timezone Offset from UTC in Seconds

    iTz = (iTz >  12*3600) ? (iTz - 24*3600) : iTz; // 14  ==> -10
    iTz = (iTz < -11*3600) ? (iTz + 24*3600) : iTz; // -14 ==> 10

    ttdateTime += iTz;

    return ttdateTime;
}