[c++20][windows] std::chrono::from_stream 사용중 버그

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++ 최신 표준을 적극적으로 사용해 볼 예정 입니다


댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다