c++ - std::get_time() in gcc 6.3 and clang 4.0 doesn't work for full month names -


i want parse date string std::get_time(), seems code works on vc++ 2015, not work on gcc 6.3 , clang 4.0. here mcve:

#include <iostream> #include <sstream> #include <string> #include <iomanip>  int main() {      std::string line = "february 4 1993 15:21";      std::tm date_1 = {};      std::stringstream ss(line);      ss >> std::get_time(&date_1, "%b %d %y %h:%m");      if(ss.fail())     {         std::cout << "parse failed\n";     }      std::cout << date_1.tm_year << "\n";     std::cout << date_1.tm_mon << "\n";     std::cout << date_1.tm_mday << "\n";     std::cout << date_1.tm_hour << "\n";     std::cout << date_1.tm_min << "\n";      return 0; } 

here's result vc++ 2015:

93 1 4 15 21 

here results gcc 6.3.2 , clang 4.0 (i've used compilers on ideone.com , coliru) - both , without c++14 flags:

parse failed 0 1 0 0 0 

it work when use abbreviated month names, such feb, aug etc.

i've tried setting different locales on stringstream (en_us, en_gb + utf-8 versions) either made no difference or resulted in runtime errors. i've tried changing separators no difference well.

i've read on cpp reference %b in std::get_time():

parses month name, either full or abbreviated, e.g. oct

is bug/missing functionality in both gcc , clang or compilers, contrary what's written above, free handle abbreviated names depending on implementation? standard that? coincidence 2 compilers exhibit same behaviour here?

as noted in comments, libstdc++ bug. not noted how work around it.

use %b instead of %b, , libstdc++ parse. parsing, %b , %b should have identical behavior. formatting, %b outputs locale's full month name while %b formats abbreviated month name.

finally, may interested in howard hinnant's free, open-source date-time library allows parse directly <chrono> time points , durations:

#include "date.h" #include <iostream> #include <sstream>  int main() {     using namespace date;     using namespace std::chrono;     std::istringstream in{"february 4 1993 15:21"};     sys_time<minutes> tp;     in >> parse("%b %d %y %h:%m", tp);     if (in.fail())         return 1;     std::cout << tp << '\n'; } 

output:

1993-02-04 15:21 

in example above sys_time<minutes> type alias std::chrono::time_point<std::chrono::system_clock, std::chrono::minutes>.


Comments

Popular posts from this blog

php - Vagrant up error - Uncaught Reflection Exception: Class DOMDocument does not exist -

vue.js - Create hooks for automated testing -

Add new key value to json node in java -