2012-02-10 2 views
8

double으로 표시되는 부분 기점 시간 소인을 가지고 있으며 적절한 std::chrono::time_point으로 변환하고 싶습니다. 1970 년 1 월 1 일 이후의 신기원은 유닉스 시대이다. std::chrono::system_clock::from_time_t이 있지만, time_t에는 분수 부분이 없다는 것을 알고 있습니다. C++ 11에서이 작업을 수행하는 가장 좋은 방법은 무엇입니까?분수 기점 타임 스탬프 (double)를 std :: chrono :: time_point로 변환하는 방법?

이 질문은 unix timestamp to boost::posix_time::ptime과 관련이 있습니다. 단, Boost 버전이 아닌 C++ 11을 요구한다는 점이 다릅니다.

+0

는 읽어 본 적이 http://www.open-std.org/jtc1/sc22/를 [N2661]를 wg21/docs/papers/2008/n2661.htm)? – ildjarn

+0

"(...) 분수 신기원 시간 소인,'double'으로 표현됨"단위는 무엇입니까? 그 시대를 아십니까? –

+0

@ R.MartinhoFernandes : 1970 년 1 월 1 일 이래 표준 UNIX 시대입니다. – mavam

답변

12

신기원이 알려진 clock 유형과 동일하다고 가정하면 double 표현으로 재생 시간을 사용할 수 있으며 해당 시계에서 사용한 재생 시간으로 변환 할 수 있습니다. 당신이 시계와 같은 정밀도를 사용하고 있기 때문에

// change period to appropriate units - I'm assuming seconds 
typedef std::chrono::duration<double, std::ratio<1>> d_seconds; 

d_seconds since_epoch_full(324324.342); 
auto since_epoch = std::chrono::duration_cast<clock::duration>(since_epoch_full); 
clock::time_point point(since_epoch); 

이는 그 시계와 관련된 모든 계산에 대한 확인을해야하지만, 변환의 정밀도의 일부가 손실 될 수 있습니다. 잃고 싶지 않다면 double 기반 지속 시간 유형을 사용하는 time_point 전문화를 사용해야합니다. 그런 다음 계산에 사용하십시오 (물론 부동 소수점 계산의 모든주의 사항 포함).

typedef std::chrono::time_point<clock, d_seconds> d_time_point; 

그러나 이것은 전환이 필요하므로 동일한 시계를 포함하는 모든 계산을 복잡하게 만듭니다. 이 쉽게하려면, 당신은 변환을 수행 자신의 시계 래퍼를 구축 할 수 있으며, 그 사용 (

template <typename Clock> 
struct my_clock_with_doubles { 
    typedef double rep; 
    typedef std::ratio<1> period; 
    typedef std::chrono::duration<rep, period> duration; 
    typedef std::chrono::time_point<my_clock_with_doubles<Clock>> time_point; 
    static const bool is_steady = Clock::is_steady; 

    static time_point now() noexcept { 
     return time_point(std::chrono::duration_cast<duration>(
        Clock::now().time_since_epoch() 
       )); 
    } 

    static time_t to_time_t(const time_point& t) noexcept { 
     return Clock::to_time_t(typename Clock::time_point(
          std::chrono::duration_cast<typename Clock::duration>(
           t.time_since_epoch() 
          ) 
         )); 
    } 
    static time_point from_time_t(time_t t) noexcept { 
     return time_point(std::chrono::duration_cast<duration>(
        Clock::from_time_t(t).time_since_epoch() 
       )); 
    } 
}; 
+0

'324324.342'는 무엇입니까? – Puppy

+0

답변 주셔서 감사합니다. 정밀도의 손실이 어디서 발생했는지 자세히 생각해 보시겠습니까? 또한'd_time_point'의 시계 유형을 임의로 지정할 수 있습니까? – mavam

+0

@Matthias : 정밀도의 손실은 시계의 기본 지속 시간 유형이 사용자가 보유한 정확한 지속 시간을 '이중'으로 표현할 수 없기 때문입니다. 예를 들어 지속 시간이 10.5 초이지만 시계가 1 초의 정수 시간을 사용하면 변환시 10 초 또는 11 초가됩니다. 이상적으로,'d_time_point'의 시계 유형은 같은 신기원을 가진 시계 유형이어야합니다. –