关于CTime::Format在Unicode下的输出问题及解决办法

2024-04-08 13:48

本文主要是介绍关于CTime::Format在Unicode下的输出问题及解决办法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

    旧有程序,在处理CTime的格式化时,经常会使用Format函数进行输出。
    普通情况下不会有问题。但最近改Bug,在旧控件中碰到一个特殊情况,发现其缺陷。

[具体状况]
    用MFC编写的OCX中,有如下简单代码:
    CTime t = CTime::GetCurrentTime();
    CString sTime = t.Format(_T("最近计算时间: %Y,%m,%d %H:%M:%S"));
    ANSI版下,上述代码执行正常,但如果是Unicode版:输出为空串,不正常。
[进一步尝试]
    将格式化串中的中文去掉,改为英文,一切正常。
[查看源码]
    查看CTime::Format的源码,发现其调用的基础函数:
    _tcsftime(szBuffer, _countof(szBuffer), pFormat, ptmTemp)
    看szBuffer和pFormat的类型:TCHAR,感觉应该支持Unicode。
[再次测试]
    另写一个OCX,用Unicode版进行测试,输出是空串。

[仔细来分析原因]
    我们来看看_tcsftime的Unicode版本,对它做个实验:
    struct tm t = { 0, 0, 12, 25, 11, 93 };
    wchar_t wsDest[255];
    wchar_t wsFormat[] = L"最近计算时间: %Y,%m,%d %H:%M:%S";
    size_t l = wcsftime(wsDest,255,wsFormat,&t);
    wsDest[l] = L'/0';
   ::MessageBoxW(NULL,wsDest,L"test",MB_OK);
    输出得到:空串。

   将格式串换成英文:
    wchar_t wsFormat[] = L"Last Time: %Y,%m,%d %H:%M:%S";
    输出:Last Time: 1993,12,25 12:00:00

[结论]
    CTime::Format 的 Unicode版居然不支持中文的格式化串。嘿。

[解决办法]
    抛弃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。

石头 于 2005-10-21

这篇关于关于CTime::Format在Unicode下的输出问题及解决办法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/885767

相关文章

Pyserial设置缓冲区大小失败的问题解决

《Pyserial设置缓冲区大小失败的问题解决》本文主要介绍了Pyserial设置缓冲区大小失败的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录问题描述原因分析解决方案问题描述使用set_buffer_size()设置缓冲区大小后,buf

resultMap如何处理复杂映射问题

《resultMap如何处理复杂映射问题》:本文主要介绍resultMap如何处理复杂映射问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录resultMap复杂映射问题Ⅰ 多对一查询:学生——老师Ⅱ 一对多查询:老师——学生总结resultMap复杂映射问题

java实现延迟/超时/定时问题

《java实现延迟/超时/定时问题》:本文主要介绍java实现延迟/超时/定时问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java实现延迟/超时/定时java 每间隔5秒执行一次,一共执行5次然后结束scheduleAtFixedRate 和 schedu

如何解决mmcv无法安装或安装之后报错问题

《如何解决mmcv无法安装或安装之后报错问题》:本文主要介绍如何解决mmcv无法安装或安装之后报错问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mmcv无法安装或安装之后报错问题1.当我们运行YOwww.chinasem.cnLO时遇到2.找到下图所示这里3.

浅谈配置MMCV环境,解决报错,版本不匹配问题

《浅谈配置MMCV环境,解决报错,版本不匹配问题》:本文主要介绍浅谈配置MMCV环境,解决报错,版本不匹配问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录配置MMCV环境,解决报错,版本不匹配错误示例正确示例总结配置MMCV环境,解决报错,版本不匹配在col

Vue3使用router,params传参为空问题

《Vue3使用router,params传参为空问题》:本文主要介绍Vue3使用router,params传参为空问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录vue3使用China编程router,params传参为空1.使用query方式传参2.使用 Histo

SpringBoot首笔交易慢问题排查与优化方案

《SpringBoot首笔交易慢问题排查与优化方案》在我们的微服务项目中,遇到这样的问题:应用启动后,第一笔交易响应耗时高达4、5秒,而后续请求均能在毫秒级完成,这不仅触发监控告警,也极大影响了用户体... 目录问题背景排查步骤1. 日志分析2. 性能工具定位优化方案:提前预热各种资源1. Flowable

Go标准库常见错误分析和解决办法

《Go标准库常见错误分析和解决办法》Go语言的标准库为开发者提供了丰富且高效的工具,涵盖了从网络编程到文件操作等各个方面,然而,标准库虽好,使用不当却可能适得其反,正所谓工欲善其事,必先利其器,本文将... 目录1. 使用了错误的time.Duration2. time.After导致的内存泄漏3. jsO

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

MySQL错误代码2058和2059的解决办法

《MySQL错误代码2058和2059的解决办法》:本文主要介绍MySQL错误代码2058和2059的解决办法,2058和2059的错误码核心都是你用的客户端工具和mysql版本的密码插件不匹配,... 目录1. 前置理解2.报错现象3.解决办法(敲重点!!!)1. php前置理解2058和2059的错误