2010-02-19 5 views
11

로컬에서까지 boost::date_time을 사용하여 시스템 시간대를 사용하여 로컬 및 UTC 시간 사이를 변환 할 수 있습니까? 나는 boost::date_time::local_adjustor에 대해 알고 있지만, 타임 존에 의존하는 오프셋 (offset) 인 템플릿 인수를 필요로한다.boost :: date_time을 사용하여 현지 시간과 보편 시간 사이의 변환하는 방법?

Failing platform-independent way 이렇게하려면 Linux에서 어떻게해야합니까?

이외에도 변환 중에 존재하지 않는 시간 지점은 어떻게 처리됩니까? 예를 들어, DST로 인해 1 시간이 부족한 경우 누락 된 시간과 시간을 변환하려고하면 결과적으로 보편적 인 시간은 어떻게됩니까?

답변

7

나는 로컬 및 UTC 시간의 차이를 찾으려면 다음 코드를 사용하고 있습니다 :


    using namespace boost::posix_time; 
    using namespace boost::gregorian; 

    time_duration UTC_Diff; 
    { 
     ptime someUTC_Time(date(2008, Jan, 1), time_duration(0, 0, 0, 0)); 
     ptime someLocalTime = boost::date_time::c_local_adjustor::utc_to_local(someUTC_Time); 
     UTC_Diff = someLocalTime - someUTC_Time; 
    } 

당신이 차이가 UTC 시간을 calcutate 쉬운 일 아닌가요 찾을 수 있기 때문에.

+0

그것은 효과가 있지만 불행합니다. ately 단 한 가지 방법, 그리고 DST 다른 날짜에 대해 다른 때문에 계산 된 오프셋을 사용할 수 없습니다. –

4

선택한 시간과 UTC 간의 차이를 기반으로하는 UTC와 로컬 간 변환은 DST 변경 순간과 동일한 수준으로 유지하는 경우에만 작동합니다.

다음은 (미안이> UTC를로나 지역적 아니에요) 어떤 날짜를 작동합니다 : 당신은 올바른 시간대에 local_date_time이있는 경우

bpt::ptime utils::utcToLocal(bpt::ptime utcTime) 
{ 
    // NOTE: the conversion functions between ptime and time_t/tm are broken so we do it ourselves. 
    bpt::time_duration timeSinceEpoch = utcTime - bpt::ptime(boost::gregorian::date(1970, 1, 1), bpt::time_duration(0,0,0)); 
    time_t secondsSinceEpoch = timeSinceEpoch.total_seconds(); 
    tm* localAsTm = localtime(&secondsSinceEpoch); 
    return bpt::ptime(
    boost::gregorian::date(
     localAsTm->tm_year + 1900, 
     localAsTm->tm_mon + 1, 
     localAsTm->tm_mday), 
    bpt::time_duration(
     localAsTm->tm_hour, 
     localAsTm->tm_min, 
     localAsTm->tm_sec)); 
} 
5

, 당신은 직접 UTC에서 시간을 얻을 수 utc_time 방법을 사용할 수 있습니다.

외모 당신이 특정 시간대에있는 것으로 해석하고 그에 대한 UTC로 변환 할 몇 가지 일반의 Ptime을 가지고 보면, 나는 그것이 주어진 재 해석 docs에 따르면,이 생성자

local_date_time(...) 
    Parameters: 
    date 
    time_duration 
    time_zone_ptr 
    bool 

을 사용하고 있습니다 시각 정보는 그것이 특정의 Ptime 현지화 사용될 수있는 수단, 및 그 utc_time 방법이 사용될 수 후, 여기 UTC로 지정된 시간대에서 임의의 Ptime 변환하는 유틸리티 함수는, 주어진 시간대 될

ptime get_local_to_utc(const ptime& t, const time_zone_ptr& localtz){ 
    if(t.is_not_a_date_time()) return t; 
    local_date_time lt(t.date(), t.time_of_day(), localtz, local_date_time::NOT_DATE_TIME_ON_ERROR); 
    return lt.utc_time(); 
} 
관련 문제