2010-02-19 103 views
11

如何使用boost::date_time使用當前系統時區在本地和UTC時間(特別是,從本地到UTC的)之間進行轉換?我知道boost::date_time::local_adjustor,但它需要一個模板參數,它是一個時區相關的偏移量。如何使用boost :: date_time在本地和世界時間之間進行轉換?

Failing platform-independent way要做到這一點,我將如何專門在Linux上做到這一點?

順便說一句,轉換過程中如何處理不存在的時間點?例如,如果一天由於DST而短了一個小時,並且我試圖從缺失的小時轉換一個時間點,那麼通用時間是多少?

回答

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; 
    } 

既然你找到差異豈不等於容易calcutate UTC時間。

+0

它工作,但很不幸只用一種方法,而且我不能使用計算出的偏移量,因爲DST使它在不同的日期有所不同。 – 2010-02-19 05:19:53

4

根據某些選定時間與UTC之間的差異,在UTC和本地之間進行轉換隻有在您保持在DST變化時刻的同一側時纔有效。

下面將任何日期的工作(對不起,這不是局地> UTC):

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

如果你有正確的時區一個local_date_time,你可以直接使用utc_time方法UTC以獲取時間。

外貌看你有一些普通的ptime,要解釋爲在一個給定的時區爲,然後將其轉換爲UTC的是,我使用此構造

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

根據docs它重新詮釋給時間數據是在給定的時區,這意味着它可以被用於定位任何給定的ptime,並且可以使用utc_time方法後,這裏是一個效用函數,以任何的ptime從一個給定的時區轉換爲UTC

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(); 
} 
相關問題