2012-03-25 5 views
7

Vorrei utilizzare C++/Boost per analizzare stringhe temporali come 1980.12.06 21:12:04.232 e acquisire un valore ticks che corrisponderebbe al numero di zecche (utilizzato per inizializzare. NET System.DateTime). Come posso farlo?Boost analizza la stringa data/ora e restituisce il valore di zecche compatibile con .NET

Aggiornamento: I do necessario utilizzare C++; Non posso usare C++/CLI per questo.

+0

Appena realizzato, si sta * effettivamente * utilizzando .NET oppure si desidera semplicemente che il valore sia lo stesso di quello fornito da .NET senza effettivamente * utilizzando * .NET? – casperOne

risposta

4
  • nel tempo Data Net parte dal 01.01.01 00:00:00
  • in spinta ptime parte da 1400.01.01 00.00.00

// C++ Codice

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

// uscite 624805819242320000

in C# per testare

01.235.
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

. Le "zecche" di Net sono a intervalli di 100 nanosecondi.

ticksType: System.Int64 Una data e tempo espresso in numero di intervalli di 100 nanosecondi trascorsi dal 1 ° gennaio 0001, a 00: 00: 00.000 in il calendario gregoriano

Quindi è necessario il conteggio delle zecche di un'epoca conosciuta (ad esempio l'epoca Unix), il numero di giorni tra l'epoca e la data/ora desiderata, e l'ora del giorno (the total_nanoseconds accessor può aiutare). Quindi è possibile calcolare facilmente il conteggio dei tick equivalenti .Net, con semplice addizione e moltiplicazione.

Potresti avere ancora problemi con l'intervallo di date rappresentabili.

Problemi correlati