2017-03-02 1 views
2

방법 로케일 무료미리 정의 된 날짜 - 시간 형식 YYYY-mm-dd HH:MM:SS.zzzzzzzzzstd::string에서에/std::chrono::time_point 변환?빠른 표준 : 크로노 변환 :: time_point을에/표준에서 : : 문자열

유일한 방법은 std::itringstreamstd::ostringstreamstd::get_timestd::put_time을 사용하는 것입니다 For me it turned out :하지만,

  • 처음 두 std::tm 마지막 두가
  • (견딜) time_t와 C 스타일의 인터페이스를 가지고 천천히 그리고 std::locale 의존적 (중요).

다른 대안이 있습니까?

타사 라이브러리도 고려할 수 있습니다. 나는 boost::posix_time::ptime을 보았지만 이음새는 또한 로케일 종속적이며, 더 느리고 덜 일반적인 것입니다. std::chrono::time_point.

+3

이것은 기본적으로 "나를 찾아 도서관"질문입니다. 그러나...C++ 20 표준화가 제안 된 바가 있습니다. 'chrono' 표준 라이브러리 구성 요소 뒤에 있던 Howard Hinnant가 만들었습니다. 그는 (우리를 위해 그것을 구현할) 충분히 좋았습니다 (https://github.com/HowardHinnant/date);). –

+0

@ NicolBolas, 대답으로 바꾸지 않으시겠습니까? –

+0

@D_N : 이것은 닫아야 할 질문입니다. –

답변

2

는 당신을 위해 충분히 빠른 경우 알아,하지만하지 마십시오 : 나를 위해

#include "date.h" 
#include <iostream> 

int 
main() 
{ 
    using namespace date; 
    std::cout << std::chrono::system_clock::now() << '\n'; 
} 

그냥 출력 :

2017-03-02 17:04:26.813110 

이 내가 작성한 라이브러리입니다. 무료 오픈 소스이며 "date.h" 부분은 헤더 전용입니다. full documentation 및 심지어 비디오 자습서가 모두 GitHub page과 연결되어 있습니다.

꽤 광범위한 서식 지정 및 구문 분석 옵션뿐만 아니라 시간 및 달력 계산을 안전하고 쉽게 수행 할 수있는 많은 다른 기능이 있습니다.

또한이 형식이 충분히 빠르지 않으면 라이브러리가 유연하게 계층화되어 하위 수준에서 상호 작용하고 자신의 I/O를 쉽게 작성할 수 있습니다. 예를 들어 여기에 당신이 마이크로 정밀도에 system_clock::time_point에서 int으로 필드 유형의 모든를 얻을 수있는 방법입니다 :

#include "date.h" 

int 
main() 
{ 
    using namespace date; 
    using namespace std::chrono; 
    auto t = system_clock::now(); 

    // Convert system_clock::time_point to days-precision time_point 
    auto sd = floor<days>(t); 
    // Create time_of_day 
    auto tod = make_time(t - sd); 
    // Create year_month_day 
    year_month_day ymd = sd; 

    // Extract field types as int 
    int y = int{ymd.year()}; // Note 1 
    int m = unsigned{ymd.month()}; 
    int d = unsigned{ymd.day()}; 
    int h = tod.hours().count(); 
    int M = tod.minutes().count(); 
    int s = tod.seconds().count(); 
    int us = duration_cast<microseconds>(tod.subseconds()).count(); 
} 

지금 당신이 원하는 그러나 이러한 int의 형식을 지정할 수 있습니다.

참고 1 : gcc-6.1 이전에는 {}에 관한 컴파일러 버그가 있습니다. 대신 ()을 사용하여 컴파일러 버그를 해결하십시오. 반대 방향 (int s의 system_clock::time_point에)가는

도 쉽게 : 당신이 원하는 그러나

#include "date.h" 

int 
main() 
{ 
    using namespace date; 
    using namespace std::chrono; 
    int y = 2017; 
    int m = 3; 
    int d = 2; 
    int h = 15; 
    int M = 33; 
    int s = 55; 
    int us = 123456; 

    // Convert field values to system_clock::time_point 
    system_clock::time_point t = sys_days(year{y}/m/d) + hours{h} + minutes{M} + 
           seconds{s} + microseconds{us}; 
} 

int의 구문 분석 한 다음 하나의 문에서 system_clock::time_point을 형성 할 수있다.

라이브러리에는 여러 플랫폼에서 유지 관리하는 데 도움이되는 활성 사용자 커뮤니티가 있습니다.

+0

나는 C++의 17 개의 제안 된 로케일 독립적 인 변환 함수'std :: from_chars'와'std :: to_chars'의'std :: chrono :: time_point'에 대해 일종의 오버로드를 찾고 있습니다. 스트림은 로케일에 의존하므로''chrono_io.h ''는 도움이되지 않습니다. – Vahagn

+0

@Vahagn : 최악의 경우 :이 라이브러리를'time_point'에서'y/m/dh : m : s' 변환 (그리고 그 반대)과 I/O를 위해 각 필드의 정수 값으로 사용할 수 있습니다 . 이 라이브러리는 이러한 매우 효율적인 (비 반복적 인) 변환 함수의 유형 안전 래퍼입니다. http://howardhinnant.github.io/date_algorithms.html –