Ускорение разбора строки даты / времени и получение значения тиков, совместимого с .NET - PullRequest
8 голосов
/ 26 марта 2012

Я бы хотел использовать C ++ / Boost для разбора временных строк, таких как 1980.12.06 21:12:04.232, и получить значение ticks, соответствующее количеству тиков (используется для инициализации .NET System.DateTime). Как я могу это сделать?

Обновление: I do необходимо использовать C ++; Я не могу использовать C ++ / CLI для этого.

Ответы [ 2 ]

5 голосов
/ 26 марта 2012
  • в .Net Дата начинается с 01.01.01 00: 00: 00
  • в усилении ptime начинается с 1400.01.01 00.00.00

// c ++ code

#include <boost/date_time/posix_time/posix_time.hpp>
int main(int argc, char* argv[])
{
    using namespace boost::posix_time;
    using namespace boost::gregorian;

    //C# offset till 1400.01.01 00:00:00
    uint64_t netEpochOffset = 441481536000000000LL;

    ptime ptimeEpoch(date(1400,1,1), time_duration(0,0,0));

    //note: using different format than yours, you'll need to parse the time in a different way
    ptime time = from_iso_string("19801206T211204,232");

    time_duration td = time - netEpoch;
    uint64_t nano = td.total_microseconds() * 10LL;

    std::cout <<"net ticks = " <<nano + netEpochOffset;

    return 0;
}

// вывод 624805819242320000

в c # для проверки

static void Main(string[] args)
{
    DateTime date = new DateTime(1400,1,1);
    Console.WriteLine(date.Ticks);

    DateTime date2 = new DateTime(624805819242320000L); //C++ output
    Console.WriteLine(date2);

            /*output
             * 441481536000000000
             * 6/12/1980 21:12:04
             * */
    return;
}
0 голосов
/ 26 марта 2012

. Тики ".Net" с интервалом в 100 наносекунд.

ticksType: System.Int64 Дата и время, выраженные в количестве 100-наносекундные интервалы, прошедшие с 1 января 0001 года в 00: 00: 00.000 по григорианскому календарю

Таким образом, вам нужно количество тиков за известную эпоху (например, эпоху Unix), количество дней между эпохой и желаемой датой / временем, а также время суток (the total_nanoseconds accessor может помочь). Затем вы можете легко рассчитать число эквивалентных тиков .Net с помощью простого сложения и умножения.

У вас все еще могут быть проблемы с представимым диапазоном дат.

...