使用std :: get_time转换ANSI C的asctime()格式

时间:2017-07-04 09:09:48

标签: c++ c++11 datetime

我想将ANSI C'格式的字符串转换为std::tm对象。

实施例

  

Sun Nov 6 08:49:37 1994; ANSI C的asctime()格式

此处有更多信息here

我的代码:

#include <string>
#include <ctime>
#include <iomanip>
#include <locale>
bool parseAscTimeDate(std::tm& tm, const std::string& str) {
    std::istringstream ss(str);
    //ss.imbue(std::locale("en_US.UTF8")); //try timezone?
    ss >> std::get_time(&tm, "%a %b  %d %H:%M:%S %Y");
    return !ss.fail();
}

那为什么会失败?

   /* ANSI C's asctime format */
   std::tm tm;
   if (parseAscTimeDate(tm, "Sun Nov  6 08:49:37 1994"))
       std::cout << "Ok!" << std::endl;
   else
       std::cout << "Wrong!" << std::endl;

其他信息

  1. 我无法使用strptime,因为musl libc中存在错误。
  2. 我试过设置一些时区但是:
  3.   

    无需设置tzname,timezone和daylight。

    来自here

    1. std::get_time example也失败了?

1 个答案:

答案 0 :(得分:5)

看起来%d格式要求每月的两位数字,与std::get_time上的描述相反:

  

d :将月中的日期解析为十进制数(范围[01,31]),允许但不是必需的前导零

这是GNU C ++标准库中报告的错误:set::get_time() requires leading 0s for %H and friends