跪求大牛解决 时间转换问题

猪猪Zz 2015-06-03 04:01:34
如何将 MSG 结构体里的 msg.time 成员(DWORD类型 ) 转换成 我们常见的时间 字符串
...全文
283 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
mymtom 2015-06-08
  • 打赏
  • 举报
回复
引用 楼主 c9080 的回复:
如何将 MSG 结构体里的 msg.time 成员(DWORD类型 ) 转换成 我们常见的时间 字符串
关键的是msg.time表示的是什么时间,你不说清楚,怎么转换啊!
mymtom 2015-06-08
  • 打赏
  • 举报
回复
引用 6 楼 c9080 的回复:
楼上能不能直接回答我得问题 粘了一堆 代码也没用啊
+1
「已注销」 2015-06-08
  • 打赏
  • 举报
回复
不好意思,上面言论有些不妥。仔细看了一下,上面的确疏忽,是少了两行代码:
BOOL TickCountToSystemTime(DWORD dwTickCount, SYSTEMTIME *lpst)
{
    if (lpst != NULL) {
        DWORD dwCurrTick = GetTickCount();
        if (dwCurrTick >= dwTickCount) {
            FILETIME ft = { 0 };
            SYSTEMTIME st = { 0 };
            GetLocalTime(&st);
            if (SystemTimeToFileTime(&st, &ft)) {
                ULARGE_INTEGER ullt = { 0 };
                ULONGLONG ullElapsed = (ULONGLONG)(dwCurrTick - dwTickCount) * 10000ULL;
                ullt.LowPart = ft.dwLowDateTime;
                ullt.HighPart = ft.dwHighDateTime;
                ullt.QuadPart -= ullElapsed;
                ft.dwLowDateTime = ullt.LowPart;
                ft.dwHighDateTime = ullt.HighPart;
                return FileTimeToSystemTime(&ft, lpst);
            }
        }
    }
    return FALSE;
}
赵4老师 2015-06-08
  • 打赏
  • 举报
回复
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒:再牛×的老师也无法代替学生自己领悟和上厕所! 单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。
「已注销」 2015-06-08
  • 打赏
  • 举报
回复
引用 16 楼 c9080 的回复:
大哥你这是忽悠我把 你中间得处理过程细看是根本没用上的啊 就是获取了系统时间 让后转成文件时间 然后又转换回去了 中间过程执行都没用得。。。。 跪求大牛 指点 怎么把 MSG.TIME 转换成当前 正常时间
其实思路是11楼提供的,我去网上搜索了下发现的确是他说的那样。只不过它的代码有个问题,应该是 LocalTime 而非 SystemTime (UTC)。我只是将其写成一个函数,进行完善,如 FILETIME 和 ULARGE_INTEGER 转换,MSDN 不建议使用指针强转。思路方法的确是对的,代码即使有问题,也只可能是语法上的问题。你说我是转来转去做了一堆无用功,那么你说函数的第一个参数被狗吃了吗?要么你没看,要么没看懂,要么根本没测试我下面给出的用法(我的函数是直接将 DWORD 时间转换为 SYSTEMTIME 结构,然后如何格式化由你自己来写),就直接说我坑你。
猪猪Zz 2015-06-07
  • 打赏
  • 举报
回复
引用 13 楼 SXJIAKE 的回复:
// FILETIME 从1601年1月1日起的100纳秒数
// 100-nanosecond=100*1/1,000,000,000=1/10,000,000秒

// GetTickCount() 从系统启动后开始计算的毫秒数
// milisecond=1/1,000秒

BOOL TickCountToSystemTime(DWORD dwTickCount, SYSTEMTIME *lpst)
{
    if (lpst != NULL) {
        DWORD dwCurrTick = GetTickCount();
        if (dwCurrTick >= dwTickCount) {
            FILETIME ft = { 0 };
            SYSTEMTIME st = { 0 };
            GetLocalTime(&st);
            if (SystemTimeToFileTime(&st, &ft)) {
                ULARGE_INTEGER ullt = { 0 };
                ULONGLONG ullElapsed = (ULONGLONG)(dwCurrTick - dwTickCount) * 10000ULL;
                ullt.LowPart = ft.dwLowDateTime;
                ullt.HighPart = ft.dwHighDateTime;
                ullt.QuadPart -= ullElapsed;
                return FileTimeToSystemTime(&ft, lpst);
            }
        }
    }
    return FALSE;
}

// 使用
SYSTEMTIME st = { 0 };
if (TickCountToSystemTime(msg.time, &st)) {
    // MFC - CString
    CString strDateTime;
    strDateTime.Format("%04u-%02u-%02u %02u:%02u:%02u", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);
    // 或 C 字符串
    char szDateTime[1024];
    wsprintf(szDateTime, "%04u-%02u-%02u %02u:%02u:%02u", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);
}
大哥你这是忽悠我把 你中间得处理过程细看是根本没用上的啊 就是获取了系统时间 让后转成文件时间 然后又转换回去了 中间过程执行都没用得。。。。 跪求大牛 指点 怎么把 MSG.TIME 转换成当前 正常时间
一根烂笔头 2015-06-04
  • 打赏
  • 举报
回复
这个需要查阅windows的API,找到相应的函数即可。MSDN走起
赵4老师 2015-06-04
  • 打赏
  • 举报
回复
引用 14 楼 WUYUAN2011WOAINI 的回复:
此时间是从系统开始计算的 即开机时间
仅供参考:
#pragma comment(lib,"ntdll")
#pragma comment(lib,"user32")
#include <afxdisp.h>
#include <windows.h>
#include <winnt.h>
#include <stdio.h>
#include <memory.h>
#include <math.h>
typedef struct tagLASTINPUTINFO {
    UINT cbSize;
    DWORD dwTime;
} LASTINPUTINFO, * PLASTINPUTINFO;
extern "C" BOOL WINAPI GetLastInputInfo(PLASTINPUTINFO plii);
LASTINPUTINFO lii;
BOOL r;
extern "C" NTSYSAPI NTAPI NtQuerySystemInformation(
    IN  UINT   SystemInformationClass,  // 信息类型
    OUT PVOID  SystemInformation,       // 缓冲指针
    IN   ULONG SystemInformationLength, // 缓冲的字节大小
    OUT PULONG ReturnLength OPTIONAL    // 写入缓冲的字节数
);
//第一个参数是请求的信息类型。这个参数可以有许多值。为了得到系统启动时间,我们只用其中的一个值:SystemTimeInformation(3)。
//如果,第一个参数是SystemTimeInformation,则第二个参数必须是一个SYSTEM_TIME_INFORMATION结构指针。
typedef struct {
    LARGE_INTEGER liKeBootTime;//系统被启动的时间(以1/10000毫秒计)。
    LARGE_INTEGER liKeSystemTime;
    LARGE_INTEGER liExpTimeZoneBias;
    ULONG         uCurrentTimeZoneId;
    DWORD         dwReserved;
} SYSTEM_TIME_INFORMATION;
SYSTEM_TIME_INFORMATION sti;
ULONG rl;
ULONG tk;
FILETIME ft;
//SYSTEMTIME lt;
//extern "C" ULONGLONG WINAPI GetTickCount64(void);
//ULONGLONG tk64;
ULONGLONG d497;
#define days_of_2_32ms 49.71026962962962962962962962963 //(2^32)/24/60/60/1000=49.71026962962962962962962962963
int main() {
    lii.cbSize=sizeof(LASTINPUTINFO);
    r=GetLastInputInfo(&lii);
    if (r) {
//      printf("OK to GetLastInputInfo:dwTime==%d ms\n",lii.dwTime);
        NtQuerySystemInformation(3,&sti,sizeof(sti),&rl);//3==SystemTimeOfDayInformation
//      printf("NtQuerySystemInformation(SystemTimeOfDayInformation,...) return liKeBootTime==%I64u ms\n",*((unsigned __int64 *)&sti.liKeBootTime)/10000ui64);
        COleDateTime t,now;
        COleDateTimeSpan ts;
        CString s,fmt="%Y-%m-%d %H:%M:%S";

        memcpy(&ft,&sti.liKeBootTime,sizeof(LARGE_INTEGER));
        t=COleDateTime(ft);
        now=COleDateTime::GetCurrentTime();
        ts=now-t;
        d497=(1ui64<<32)*(unsigned __int64)floor(ts.GetTotalDays()/days_of_2_32ms);
        s=t.Format(fmt);
        printf("     BootDateTime: %s.%03I64u\n",s,*((unsigned __int64 *)&ft)/10000ui64%1000ui64);
        *((unsigned __int64 *)&ft)+=((unsigned __int64)(lii.dwTime)+d497)*10000ui64;
        t=COleDateTime(ft);
        s=t.Format(fmt);
        printf("LastInputDateTime: %s.%03I64u\n",s,*((unsigned __int64 *)&ft)/10000ui64%1000ui64);

//      这样显示的当前时间的毫秒数不会大于LastInputDateTime;但开机超过49.7天时不精确。
//      但The elapsed time is stored as a DWORD value. Therefore, the time will wrap around to zero if the system is run continuously for 49.7 days.
//      如果系统支持的话(Windows Vista/Windows Server 2008),可以调用ULONGLONG GetTickCount64(void)
        tk=GetTickCount();//tk64=GetTickCount64();
        memcpy(&ft,&sti.liKeBootTime,sizeof(LARGE_INTEGER));
        *((unsigned __int64 *)&ft)+=((unsigned __int64)tk+d497)*10000ui64;//tk64*10000ui64
        t=COleDateTime(ft);
        s=t.Format(fmt);
        printf("      NowDateTime: %s.%03I64u\n",s,*((unsigned __int64 *)&ft)/10000ui64%1000ui64);

//      这样显示的当前时间的毫秒数会大于LastInputDateTime;但开机超过49.7天时不会不精确。
//      GetLocalTime(<);
//      printf("      NowDateTime: %4d-%02d-%02d %02d:%02d:%02d.%03d\n",lt.wYear,lt.wMonth,lt.wDay,lt.wHour,lt.wMinute,lt.wSecond,lt.wMilliseconds);

        Sleep(15);//延迟15毫秒,方便在外部批处理脚本中循环调用
    } else {
        printf("Fail to GetLastInputInfo!\n");
        return 1;
    }
    return 0;
}
//     BootDateTime: 2014-04-17 08:45:30.375
//LastInputDateTime: 2014-04-17 17:18:38.843
//      NowDateTime: 2014-04-17 17:18:38.859
//
kuankuan_qiao 2015-06-04
  • 打赏
  • 举报
回复
此时间是从系统开始计算的 即开机时间
「已注销」 2015-06-04
  • 打赏
  • 举报
回复
// FILETIME 从1601年1月1日起的100纳秒数
// 100-nanosecond=100*1/1,000,000,000=1/10,000,000秒

// GetTickCount() 从系统启动后开始计算的毫秒数
// milisecond=1/1,000秒

BOOL TickCountToSystemTime(DWORD dwTickCount, SYSTEMTIME *lpst)
{
    if (lpst != NULL) {
        DWORD dwCurrTick = GetTickCount();
        if (dwCurrTick >= dwTickCount) {
            FILETIME ft = { 0 };
            SYSTEMTIME st = { 0 };
            GetLocalTime(&st);
            if (SystemTimeToFileTime(&st, &ft)) {
                ULARGE_INTEGER ullt = { 0 };
                ULONGLONG ullElapsed = (ULONGLONG)(dwCurrTick - dwTickCount) * 10000ULL;
                ullt.LowPart = ft.dwLowDateTime;
                ullt.HighPart = ft.dwHighDateTime;
                ullt.QuadPart -= ullElapsed;
                return FileTimeToSystemTime(&ft, lpst);
            }
        }
    }
    return FALSE;
}

// 使用
SYSTEMTIME st = { 0 };
if (TickCountToSystemTime(msg.time, &st)) {
    // MFC - CString
    CString strDateTime;
    strDateTime.Format("%04u-%02u-%02u %02u:%02u:%02u", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);
    // 或 C 字符串
    char szDateTime[1024];
    wsprintf(szDateTime, "%04u-%02u-%02u %02u:%02u:%02u", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);
}
iyomumx 2015-06-04
  • 打赏
  • 举报
回复
What clock do MSG.time and GetMessageTime use? 按MSDN Blog的说法,用GetTickCount来算 类似
FILETIME ft;
GetSystemTimeAsFileTime(&ft); //前两行获得当前时间
*(ULONGLONG)&ft -= ULONGLONG(GetTickCount() - dwTime) * 10000;//用当前时间减去相当单位的TickCount-dwTime
这样的代码
猪猪Zz 2015-06-03
  • 打赏
  • 举报
回复
有木有大牛 跪求指点啊
猪猪Zz 2015-06-03
  • 打赏
  • 举报
回复
有人有大牛可以指点下 如何将MSG.TIME 转换成当前正常时间 字符串
猪猪Zz 2015-06-03
  • 打赏
  • 举报
回复
引用 7 楼 lixin_4055 的回复:
[quote=引用 6 楼 c9080 的回复:] 楼上能不能直接回答我得问题 粘了一堆 代码也没用啊
楼上基本说全了,还有啥不明白的 [/quote] 我要的是 MSG.TIME 是怎么转换成当前正常的时间
lixin_4055 2015-06-03
  • 打赏
  • 举报
回复
引用 6 楼 c9080 的回复:
楼上能不能直接回答我得问题 粘了一堆 代码也没用啊
楼上基本说全了,还有啥不明白的
猪猪Zz 2015-06-03
  • 打赏
  • 举报
回复
楼上能不能直接回答我得问题 粘了一堆 代码也没用啊
707wk 2015-06-03
  • 打赏
  • 举报
回复
引用 4 楼 zhao4zhong1 的回复:
仅供参考:
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <time.h>
#include <sys/timeb.h>

struct tm st;
time_t tt;
char mon[4];
char mn[12][4]={"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"};
int i;
char timstr[27];
char tmpbuf[128];
struct _timeb tb;
int tz;
char c;

void main() {
    strcpy(timstr,"08/Dec/2011:15:25:03 +0800");
    sscanf(timstr,"%2d/%3s/%4d:%2d:%2d:%2d",&st.tm_mday,mon,&st.tm_year,&st.tm_hour,&st.tm_min,&st.tm_sec);
    for (i=0;i<12;i++) if (0==stricmp(mn[i],mon)) {st.tm_mon=i; break;}
    st.tm_year-=1900;
    tt=mktime(&st);
    if (-1!=tt) {
        strftime(tmpbuf,128,"%Y-%m-%d %H:%M:%S\n",localtime(&tt));
        printf(tmpbuf);//2011-12-08 15:25:03
    } else {
        printf("[%s] is Invalid time string!\n",timstr);
    }

    _ftime(&tb);
    strftime(tmpbuf,128,"%m/%b/%Y:%H:%M:%S",localtime(&tb.time));
    tz=-tb.timezone;
    c=(tz>0)?'+':'-';
    tz=(tz>0)?tz:-tz;
    sprintf(tmpbuf,"%s %c%02d%02d\n",tmpbuf,c,tz/60,tz%60);
    printf(tmpbuf);//12/Dec/2011:17:36:41 +0800
}
+1,
赵4老师 2015-06-03
  • 打赏
  • 举报
回复
仅供参考:
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <time.h>
#include <sys/timeb.h>

struct tm st;
time_t tt;
char mon[4];
char mn[12][4]={"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"};
int i;
char timstr[27];
char tmpbuf[128];
struct _timeb tb;
int tz;
char c;

void main() {
    strcpy(timstr,"08/Dec/2011:15:25:03 +0800");
    sscanf(timstr,"%2d/%3s/%4d:%2d:%2d:%2d",&st.tm_mday,mon,&st.tm_year,&st.tm_hour,&st.tm_min,&st.tm_sec);
    for (i=0;i<12;i++) if (0==stricmp(mn[i],mon)) {st.tm_mon=i; break;}
    st.tm_year-=1900;
    tt=mktime(&st);
    if (-1!=tt) {
        strftime(tmpbuf,128,"%Y-%m-%d %H:%M:%S\n",localtime(&tt));
        printf(tmpbuf);//2011-12-08 15:25:03
    } else {
        printf("[%s] is Invalid time string!\n",timstr);
    }

    _ftime(&tb);
    strftime(tmpbuf,128,"%m/%b/%Y:%H:%M:%S",localtime(&tb.time));
    tz=-tb.timezone;
    c=(tz>0)?'+':'-';
    tz=(tz>0)?tz:-tz;
    sprintf(tmpbuf,"%s %c%02d%02d\n",tmpbuf,c,tz/60,tz%60);
    printf(tmpbuf);//12/Dec/2011:17:36:41 +0800
}
猪猪Zz 2015-06-03
  • 打赏
  • 举报
回复
msg.time记录的是消息发生的时间吗,如果是 怎么把他转换成常见的 时间格式字符串 我试过一些方法 但是的到的时间都不是当前的正常时间 求大牛指点
加载更多回复(2)

69,374

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧