我在VS2005.NET VC++ 使用Unicode字符集,用MFC 编程取当前时间,用下面的程序段: CTime m_time = GetCurrentTime();
CString str_time=m_time.Format(L"%Y/%m/%d %H:%M:%S");
MessageBox(str_time,L"显示当前时间");
遇到下面的问题:
1.取出的系统当前日期是:1970/04/18,为什么不是系统当前的日期?
2.如果我把格式字符串改成下面的形式: CString str_time=m_time.Format(L"%Y年%m月%d日 %H:%M:%S"); 即在格式化字符串加上汉字后,则格式化后的字符串是空的!为什么?怎么样解决?请专家给出解决的办法,谢谢!
CString str_time=m_time.Format(L"%Y/%m/%d %H:%M:%S");
MessageBox(str_time,L"显示当前时间");
遇到下面的问题:
1.取出的系统当前日期是:1970/04/18,为什么不是系统当前的日期?
2.如果我把格式字符串改成下面的形式: CString str_time=m_time.Format(L"%Y年%m月%d日 %H:%M:%S"); 即在格式化字符串加上汉字后,则格式化后的字符串是空的!为什么?怎么样解决?请专家给出解决的办法,谢谢!
pomelowu(羽战士) :
我打开了您给的网页,谢谢你,看来这个函数在Unicode下是不能用,也没有替代的函数,Microsoft不知是否发现了这个问题,不知以后是否能改正过来.我不知道这个博客是不是你的,文中说他已经解决了这个问题,但是我运行了他提供的程序,还是有问题,原文如下:
[解决办法]
抛弃CTime这个低级垃圾东东,换上新式武器。
我另写了一个格式化的函数,为了与以前兼容,我仍接受CTime的输入。CString CBaseUtil::FormatDateTime(const CTime &t)
{
CString sRet(_T(""));
if(!t.GetLocalTm()) return sRet; //t未初始化,不合法。
//或者断言 ASSERT(t.GetLocalTm()) //格式化串的格式可参见VarFormat的帮助
//如:最近计算时间: yyyy,mm,dd hh:nn:ss
CString sFormat = sFormat.LoadString(格式化串);
COleDateTime dt(t.GetYear(),t.GetMonth(),t.GetDay(),
t.GetHour(),t.GetMinute(),t.GetSecond()); COleVariant var(dt);
BSTR bstrOut = sRet.AllocSysString();
#ifdef _UNICODE
VarFormat(var,sFormat.GetBuffer(0),0,0,0,&bstrOut);
#else
USES_CONVERSION;
VarFormat(var,A2W(sFormat.GetBuffer(0)),0,0,0,&bstrOut);
#endif
sRet = bstrOut;
::SysFreeString(bstrOut);
return sRet;
} 好了,上述的做法就OK了,如果不用CTime做参数,那最好,因为CTime
范围也比较窄,可直接使用COleDateTime。
作者说已经"OK"了,但是我在编译时有两个问题:
1.原文给出的程序的第二行: if(!t.GetLocalTm()) return sRet; //t未初始化,不合法。所用的函数t.GetLocalTm()是要有参数的,没有参数是通不过的;2.下面的语句: CString sFormat = sFormat.LoadString(格式化串); 也是有问题的.不知道作者是怎么样"OK"的?能不能给个能通得过的程序啊,否则让我们初学者云里雾里的,摸不着头脑.
多谢了!!!