2012-03-25 6 views
7

Me gustaría usar C++/Boost para analizar series de tiempo como 1980.12.06 21:12:04.232 y adquirir un valor ticks que correspondería al conteo de ticks (utilizado para inicializar. NET System.DateTime). ¿Cómo puedo hacerlo?Boost parse cadena de fecha/hora y rendimiento .NET-Ticks valor compatible

Actualización: me hago necesidad de utilizar C++; No puedo usar C++/CLI para esto.

+0

Acabo de dar cuenta, ¿está * realmente * usando .NET, o simplemente quiere que el valor sea el mismo que proporciona .NET sin utilizar * .NET * en realidad? – casperOne

Respuesta

4
  • en el tiempo Fecha .Net comienza desde 01.01.01 00:00:00
  • en ptime impulso comienza a partir 1400.01.01 00.00.00

// código C++

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

// salidas 624805819242320000

en C# para poner a prueba

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

.Net "Ticks" está en intervalos de 100 nanosegundos.

ticksType: System.Int64 Una fecha y hora expresados ​​en el número de intervalos de 100 nanosegundos transcurridos desde el 1 de enero de 0001 en 00: 00: 00.000 en el calendario gregoriano

por lo que necesita el recuento de paso de una época conocida (por ejemplo, la época Unix), el número de días entre la época y la fecha/hora deseada, y la hora del día (the total_nanoseconds accessor puede ayudar). Luego puede calcular fácilmente el conteo de ticks equivalente a .Net, con suma y multiplicación simples.

Aún puede tener problemas relacionados con el rango de fechas representable.