c++ 모던, 그리고 20로 발전되어 오면서 사소한 구현을 std 의 라이브러리/함수를 사용하면 편리해 졌습니다..
대다수가 안되던 것은 당연히 아니니까요
그중에서 string 시간/날자 를 chrono time , time_point 로 변환할 수 있는
https://en.cppreference.com/w/cpp/chrono/duration/from_stream
from_stream 을 사용할 수 있습니다
예를들면 “2021-12-06 12:31:04” 같은 문자열을 time_point 로 변환할 수 있고 연산이나 값을 사용할 수 있죠..
다만 이는 현재 버그가 있습니다 일단 버그는
https://github.com/microsoft/STL/issues/2163
https://github.com/microsoft/STL/issues/1911
위와 같이 github microsoft STL 쪽에 issue 로 남겨져 open 상태 입니다
내용은 win10, win2019(19H1) 이하 버전 이하에서는
23시59분 59초 의 변환시 모듈을 찾을수 없다면서 오류가 발생 합니다
std::string time_ymdhhmmss = R"(2021-12-06 12:31:04)"; std::chrono::system_clock::time_point tp; std::istringstream ss(time_ymdhhmmss.c_str()); if (std::chrono::from_stream(ss, "%F %T", tp)) { std::cout << "timeall: " << tp << '\n'; }
위의 코드는 무난하게 parse 됩니다…
std::string time_err = R"(2021-12-06 23:59:59)"; std::chrono::system_clock::time_point tp; std::istringstream ss(time_ymdhhmmss.c_str()); if (std::chrono::from_stream(ss, "%F %T", tp)) { std::cout << "timeall: " << tp << '\n'; }
다만 위 코드의 경우 …. 특정 os 에서 정상 동작하지 못합니다
심지어 예외를 throw 합니다.. return false 도 아니죠..
원인은 내부 구현을 따라가 보았을 때에 예측하긴 했으나
ICU DLL is only available in a digestible form (for us) in 19H1 and more recent OSes.
이슈에 남겨진 이 내용대로 ICU 관련 dll 이 부재로 사용할 수 없습니다
std::string time_err = R"(2021-12-06 23:59:59)"; std::tm t = {}; std::istringstream ss(time_err); ss.imbue(std::locale("ko_KR.utf-8")); ss >> std::get_time(&t, "%Y-%b-%d %H:%M:%S"); if (ss.fail()) { std::cout << "Parse failed\n"; } else { auto epochS = mktime(&t); ASSERT_EQ(1638802799, epochS); }
부득이 하게도 .. c++20 의 from_stream 기능을 신뢰할 수 없게 되었고 위 코드로 수정해 사용해야합니다
관련 코드를 사용 시 유의하시면 좋을 것 같습니다
물론 그래도 c++ 최신 표준을 적극적으로 사용해 볼 예정 입니다
댓글 남기기