boost ptime с сервера sql timestamp_t отключен минутами.Что я сделал не так? - PullRequest
0 голосов
/ 14 сентября 2011

У меня есть база данных сервера SQL, и я извлекаю из нее даты и преобразовываю тип timestamp_t в Int64 следующим образом:

Int64 from_timestamp_t(dtl::timestamp_t& t)
{
    // create a new posix time structure
    boost::posix_time::ptime pt
    (
    boost::gregorian::date           ( t.year, t.month, t.day),
    boost::posix_time::time_duration ( t.hour, t.minute, t.second, t.fraction )
    );

    ptime epoch(date(1970, Jan, 1));
    boost::posix_time::time_duration fromEpoch = pt - epoch;

    // return it to caller
    return fromEpoch.total_milliseconds();
}

Я пытаюсь преобразовать обратно в ptime повышения из Int64 как такового:

ptime from_epoch_ticks(Int64 ticksFromEpoch)
{
    ptime epoch(date(1970, Jan, 1), time_duration(0,0,0));
    ptime time = epoch + boost::posix_time::milliseconds(ticksFromEpoch);

    return time;
}

По какой-то причине, и я не могу понять, почему мои даты, часы и т. Д. Все верны, но мои минуты опережают на несколько минут то, что они должны быть.Это потому, что временные метки из базы данных имеют разрешение в секундах, а я использую миллисекунды?Как мне это исправить?

Применение следующей модификации, предложенной Даном, похоже, решило проблему:

Int64 from_timestamp_t(dtl::timestamp_t& t)
{
    int count = t.fraction * (time_duration::ticks_per_second() % 1000);

    boost::posix_time::ptime pt
        (
        boost::gregorian::date           ( t.year, t.month, t.day ),
        boost::posix_time::time_duration ( t.hour, t.minute, t.second, count )
        );

    ptime epoch(date(1970, Jan, 1), time_duration(0, 0, 0, 0));

    boost::posix_time::time_duration fromEpoch = pt - epoch;

    return fromEpoch.total_milliseconds();
}

1 Ответ

1 голос
/ 14 сентября 2011

Я не знаком с SQL Server 2005, но время ускорения posix имеет функцию секунд , если ticksFromEpoch эквивалентно одной секунде.

ptime time = epoch + boost::posix_time::seconds(ticksFromEpoch);

Однако общий способ справиться с этим представлен в документации date_time :

Другой способ справиться с этим - использовать метод ticks_per_second () time_duration для написания переносимого кода независимо от того, как библиотека скомпилирована. Общее уравнение для расчета разрешения Независимый счет выглядит следующим образом:

count*(time_duration_ticks_per_second / count_ticks_per_second)

Например, давайте предположим, что мы хотим построить с использованием счетчика это составляет десятые доли секунды. То есть каждый тик составляет 0,1 секунды.

int number_of_tenths = 5; // create a resolution independent count -- 
                          // divide by 10 since there are
                          //10 tenths in a second.
int count = number_of_tenths*(time_duration::ticks_per_second()/10);
time_duration td(1,2,3,count); //01:02:03.5 //no matter the resolution settings
...