2010-02-19 4 views
11

Jak mogę przekonwertować czas lokalny i czas UTC (w szczególności z lokalnego na UTC) przy użyciu boost::date_time przy użyciu strefy czasowej systemu obecnej? Wiem o boost::date_time::local_adjustor, ale wymaga to szablonu, który jest zależny od strefy czasowej.Jak przekonwertować czas lokalny i uniwersalny za pomocą metody boost :: date_time?

Failing platform-independent way Aby to zrobić, w jaki sposób mogę to zrobić specjalnie w systemie Linux?

Odkładając na bok, w jaki sposób nie ma punktów czasowych przetwarzanych podczas konwersji? Na przykład, jeśli dzień jest krótszy o jedną godzinę z powodu DST, a ja próbuję zmienić punkt czasowy z brakującej godziny, jaki będzie wynikowy czas uniwersalny?

Odpowiedz

7

używam następujący kod, aby znaleźć różnicę pomiędzy czasem lokalnym a 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; 
    } 

Od znaleźć różnicę is't łatwo calcutate czas UTC.

+0

Działa, ale niestety tylko jeden sposób i nie mogę użyć wyliczonego przesunięcia, ponieważ DST zmienia je dla różnych dat. –

4

Konwersja pomiędzy UTC i lokalnym na podstawie różnic między wybranym czasem a UTC działa tak długo, jak długo pozostaje po tej samej stronie momentu zmiany czasu letniego.

Poniższa będzie pracować dla dowolnej daty (przepraszam to nie na szczeblu lokalnym> 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

Jeśli masz local_date_time we właściwej strefie czasowej, można korzystać bezpośrednio utc_time sposób, aby uzyskać czas w UTC.

Looks wyglądać masz jakiś zwykły ptime, którego chcesz interpretować jako w danej strefie czasowej, a następnie przekształcić go na UTC za to, używam tego konstruktora

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

Według docs to nowo interpretuje dane dane czasowe być w danej strefy czasowej, to znaczy, że może on być stosowany do lokalizacji dowolną ptime, po czym metodą utc_time mogą być stosowane, jest tutaj funkcja narzędzie do konwertowania dowolnego ptime od danej strefy czasowej 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(); 
} 
Powiązane problemy