2014-07-05 3 views
1

문자열에 boost::posix_time::ptime 변수를 직렬화해야합니다. 내가 원하는 형식은 2014-05-12T16:14:01.809+0200입니다. 웹 서비스에서 요청되기 때문에 변경할 수 없으며 요청한 형식을 준수해야합니다. 나는 시간대가 로컬임을 암시 할 수있다. 몇 가지 예를 보았지만 UTC ptime에서 std::string을 얻는 방법을 찾지 못했습니다.사용자 지정 형식으로 부스트 ptime을 serialize

내가 원하는 것에 대한 세부 정보를 추가했습니다. 나는 boost::posix_time::ptime부터 시작합니다. 이전에 지정한 형식으로 인쇄하고 싶지만 실제 시간대가 무엇인지 모릅니다. 라이브러리 함수 호출을 통해 찾아야합니다. 당신은 소수점 이하의 초 일부 후행 000 괜찮다면 std::string time_to_custom_string(boost::posix_time::ptime datetime);

답변

0

:

#include <boost/date_time/local_time/local_time.hpp> 
#include <locale> 

static boost::local_time::time_zone_ptr const s_timezone(new boost::local_time::posix_time_zone("+02:00")); 

std::string mydateformat(boost::local_time::local_date_time const& ldt) 
{ 
    using namespace boost; 
    std::ostringstream ss; 

    boost::local_time::local_time_facet* output_facet = new boost::local_time::local_time_facet(); 
    ss.imbue(std::locale(std::locale::classic(), output_facet)); 
    output_facet->format("%Y-%m-%dT%H:%M:%s%q"); 

    ss.str(""); 
    ss << ldt; 
    return ss.str(); 
} 

std::string mydateformat() 
{ 
    using namespace boost; 

    posix_time::ptime my_ptime = posix_time::second_clock::universal_time(); 
    local_time::local_date_time ldt(my_ptime, s_timezone); 

    return mydateformat(ldt); 
} 

int main() 
{ 
    using namespace boost; 

    gregorian::date d(2014, 5, 12); 
    posix_time::time_duration td(16, 14, 1, 809000); 
    local_time::local_date_time ldt(d, td, s_timezone, false/*daylight savings*/); 

    std::cout << mydateformat(ldt) << "\n"; 
    assert("2014-05-12T16:14:01.809000+0200" == mydateformat(ldt)); 
} 
+0

감사합니다, 그것은 내가 정말 아니다 그럼 내가이해야 할 것은이 프로토 타입으로 함수를 작성하는 것입니다 원하지만 내가 원하는 것을 설명하는 내 잘못이 될 수 있습니다. 그것은 실제 솔루션을 찾는데 도움이 될 수 있습니다. 더 자세한 내용으로 내 질문을 업데이트합니다. – user3807511

+0

@ user3807511'ptime'에서'local_date_time'을 얻는 방법이 이미 표시되어 있습니다 ('mydateformat'의 두 번째 오버로드!). "시스템 시간대"로 변환하려면 설명서를 참조하십시오. 그러나 시스템 시간대를 신뢰하면 보안 상 취약 할 수 있습니다. – sehe

+0

문자열''+02 : 00 "'을 포함하는 표현식에서'utc_time_zone'이 초기화 된 이유를 설명 할 수 있습니까? –

관련 문제