2010-02-19 32 views
11

Làm cách nào để chuyển đổi giữa thời gian địa phương và UTC (cụ thể là từ địa phương sang UTC) bằng cách sử dụng boost::date_time bằng cách sử dụng hiện tại múi giờ hệ thống? Tôi biết về boost::date_time::local_adjustor, nhưng nó đòi hỏi một đối số mẫu mà là một bù đắp phụ thuộc múi giờ.Làm thế nào để chuyển đổi giữa thời gian địa phương và quốc tế bằng cách sử dụng boost :: date_time?

Failing platform-independent way để làm điều đó, tôi sẽ làm điều đó một cách cụ thể trên Linux như thế nào?

Là một sang một bên, các điểm thời gian không tồn tại được xử lý như thế nào trong quá trình chuyển đổi? Ví dụ, nếu một ngày là một giờ ngắn do DST, và tôi cố gắng để chuyển đổi một điểm thời gian từ giờ mất tích, những gì sẽ là thời gian phổ quát kết quả?

Trả lời

7

Tôi đang sử dụng đoạn mã sau để tìm sự khác biệt giữa giờ địa phương và 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; 
    } 

Kể từ khi bạn tìm thấy sự khác biệt is't dễ calcutate thời gian tính theo giờ UTC.

+0

Nó hoạt động, nhưng không may chỉ có một cách, và tôi không thể sử dụng bù đắp được tính toán kể từ khi DST làm cho nó khác nhau cho các ngày khác nhau. –

4

Chuyển đổi giữa UTC và địa phương dựa trên sự khác biệt giữa một số thời gian đã chọn và UTC chỉ hoạt động miễn là bạn ở lại cùng một phía của thời điểm thay đổi DST.

Sau đây sẽ làm việc cho bất kỳ ngày (xin lỗi nó không local-> 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

Nếu bạn có một local_date_time trong múi giờ chính xác, bạn có thể trực tiếp sử dụng utc_time phương pháp để có được thời gian trong giờ UTC.

vẻ trông bạn có một số ptime đồng bằng, mà bạn muốn giải thích như là trong một múi giờ nhất định và sau đó chuyển nó sang UTC vì điều đó, tôi đang sử dụng constructor này

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

Theo docs nhưng nó giải thích cho dữ liệu thời gian để được ở múi giờ nhất định, nó có nghĩa là nó có thể được sử dụng để khoanh vùng bất kỳ ptime nhất định, và sau đó phương pháp utc_time có thể được sử dụng, đây là một chức năng tiện ích để chuyển đổi bất kỳ ptime từ một múi giờ cho 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(); 
} 
Các vấn đề liên quan