none
请教大家 是strftime返回值BUG还是我的用法错误 RRS feed

  • 问题

  • 请教大家 是strftime返回值BUG还是我的用法错误

         编译时使用 使用多字节字符集

    std::locale::global(std::locale("chs"));

    time_t t = time(NULL);tm* tmNow = localtime(&t);

    char strBuf[1024];

    int nLen = strftime(strBuf,1024,"%Y年%m月%d日.log",tmNow); //nLen = 15 返回长度不正确。

    nLen = strlen(strBuf); //nLen = 18 正确的长度。





    2016年12月8日 3:04

答案

全部回复

  • VS2015上测试都是18,不管设置是Unicode编码还是多字节编码。
    #include <Windows.h>
    #include <iostream>
    #include <time.h>
    using namespace std;
    
    int main()
    {
    	std::locale::global(std::locale("chs"));
    	time_t t = time(NULL); 
    	tm tmNow;
    	localtime_s(&tmNow, &t);
    	char strBuf[1024];
    	int nLen = strftime(strBuf, 1024, "%Y年%m月%d日.log", &tmNow); //nLen = 15 返回长度不正确。
    	cout << nLen << endl;
    	nLen = strlen(strBuf); //nLen = 18 正确的长度。
     	cout << nLen << endl;
    	
        return 0;
    }
    


    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.

    2016年12月8日 6:01
    版主
  • Hi 三水良子,

    感谢在MSDN论坛发帖。

    >>请教大家 是strftime返回值BUG还是我的用法错误

    使用你的代码在我的机器上测试过,结果两次返回的长度都是15。而且你的字符包含中文,建议你选择unicode编码或者使用wchar_t双字节显示。

    最终的字符串为,长度就是15:

    2016年12月08日.log

    请问你得到的字符串为什么格式? 为何会认为18为正确的字符长度?

    Best Regards,
    Sera Yu


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2016年12月8日 6:27
  • 我使用的WIN7 VS2012,不管设置是Unicode编码还是多字节编码strftime返回值都是15,strlen返回值都是18.

    这是log4cplus-1.2.0里面fileappender.cxx里面

    void
    TimeBasedRollingFileAppender::open(std::ios_base::openmode mode)
    {
        scheduledFilename = Time::gettimeofday().getFormattedTime(filenamePattern, false);

    这里如果日志文件名称中有中文,返回的scheduledFilename长度将是错误的。

    看来是VS2012的问题了。


    • 已编辑 三水良子 2016年12月8日 7:19 操作系统WIN7
    2016年12月8日 7:12
  • 我的字符串是GBK编码,WIN7系统,VS2012

    请问你使用那个版本的VS?操作系统是WIN几?


    2016年12月8日 7:18
  • 在同事WIN10上测试了一下,strftime返回值为18,我的WIN7上返回就是15,看来是系统问题,不是VS问题。
    2016年12月8日 7:37