2012-05-18 10 views
10

ho bisogno di ottenere millisecondi dal timerottenere una parte millisecondo di tempo

// get timer part 
    time_t timer = time(NULL); 
    struct tm now = *localtime(&timer); 
    char timestamp[256]; 

    // format date time 
    strftime(timestamp, sizeof(timestamp), "%Y-%m-%d_%H.%M.%S", &now); 

voglio ottenere come questo in C#:

DateTime.Now.ToString("yyyy-MM-dd_HH.mm.ss.ff") 

Ho provato ad utilizzare% fo% F ma lo fa lavorare con C++. come posso ottenere% f per milisecondi da tm?

Grazie in anticipo

+3

'time()' restituisce l'intero ** ** numero di secondi dall'epoca. Quindi, ovviamente, non è possibile ottenere la precisione del sottocondo usandolo. Usa invece 'gettimeofday()'. –

+0

Questo ha bisogno di funzionare solo su Windows o è multipiattaforma? – tinman

+0

per UNIX, controllare il mio prestito [classe] (http://stackoverflow.com/questions/10608159/is-this-an-overflow/10608574#10608574) che ho inviato ad un'altra risposta qui su SO. Potresti smontarlo per ottenere solo i millisecondi. – Drise

risposta

3

È possibile Youse boost::posix_time::ptime classe. Il suo reference there.

+2

Non voglio ottenere dipendenza dalla libreria di boost solo per usare il timer – olidev

13
#include <chrono> 

typedef std::chrono::system_clock Clock; 

auto now = Clock::now(); 
auto seconds = std::chrono::time_point_cast<std::chrono::seconds>(now); 
auto fraction = now - seconds; 
time_t cnow = Clock::to_time_t(now); 

Quindi è possibile stampare il time_t con secondi precisione e quindi stampare qualunque sia la frazione rappresenta. Potrebbe essere millisecondi, microsecondi o qualcos'altro. Per ottenere specificamente millisecondi:

auto milliseconds = std::chrono::duration_cast<std::chrono::milliseconds>(fraction); 
std::cout << milliseconds.count() << '\n'; 
+4

Questo è l'approccio di C++ 11 – linquize

+0

Per quanto posso dire, non è possibile applicare direttamente 'duration_cast' a punti temporali. –

+0

@KyleStrand Hai ragione. Ho pubblicato una correzione. – bames53

5

su Windows utilizzando API Win32 SYSTEMTIME structure vi darà millisecondi. Quindi, è necessario utilizzare Time Functions per ottenere tempo. Ti piace questa:

#include <windows.h> 

int main() 
{ 
    SYSTEMTIME stime; 
    //structure to store system time (in usual time format) 
    FILETIME ltime; 
    //structure to store local time (local time in 64 bits) 
    FILETIME ftTimeStamp; 
    char TimeStamp[256];//to store TimeStamp information 
    GetSystemTimeAsFileTime(&ftTimeStamp); //Gets the current system time 

    FileTimeToLocalFileTime (&ftTimeStamp,&ltime);//convert in local time and store in ltime 
    FileTimeToSystemTime(&ltime,&stime);//convert in system time and store in stime 

    sprintf(TimeStamp, "%d:%d:%d:%d, %d.%d.%d",stime.wHour,stime.wMinute,stime.wSecond, 
      stime.wMilliseconds, stime.wDay,stime.wMonth,stime.wYear); 

    printf(TimeStamp); 

    return 0; 
} 
3

Ecco un altro C++ 11 risposta:

#include <iostream> 
#include <iomanip> 
#include <chrono> 
#ifdef WIN32 
#define localtime_r(_Time, _Tm) localtime_s(_Tm, _Time) 
#endif 

int main() 
{ 
    tm localTime; 
    std::chrono::system_clock::time_point t = std::chrono::system_clock::now(); 
    time_t now = std::chrono::system_clock::to_time_t(t); 
    localtime_r(&now, &localTime); 

    const std::chrono::duration<double> tse = t.time_since_epoch(); 
    std::chrono::seconds::rep milliseconds = std::chrono::duration_cast<std::chrono::milliseconds>(tse).count() % 1000; 

    std::cout << (1900 + localTime.tm_year) << '-' 
     << std::setfill('0') << std::setw(2) << (localTime.tm_mon + 1) << '-' 
     << std::setfill('0') << std::setw(2) << localTime.tm_mday << ' ' 
     << std::setfill('0') << std::setw(2) << localTime.tm_hour << ':' 
     << std::setfill('0') << std::setw(2) << localTime.tm_min << ':' 
     << std::setfill('0') << std::setw(2) << localTime.tm_sec << '.' 
     << std::setfill('0') << std::setw(3) << milliseconds 
     << std::endl; 
} 
1

sotto MS Visual Studio C/C++ includono sys/timeb.h e usa _ftime (_ftime_s). recupera un _timeb struct (_ftime64) contenente lo struct time_t e anche millisecondi, vedere MSDN http://msdn.microsoft.com/en-/library/z54t9z5f.aspx

#include <sys/timeb.h> 

struct _timeb timebuffer; 
_ftime(&timebuffer); 
timebuffer.millitm; //milli seconds 
timebuffer.time; //the same like struct time_t 
0

Prova con questo codice:

struct tvTime; 

gettimeofday(&tvTime, NULL); 

int iTotal_seconds = tvTime.tv_sec; 
struct tm *ptm = localtime((const time_t *) & iTotal_seconds); 

int iHour = ptm->tm_hour;; 
int iMinute = ptm->tm_min; 
int iSecond = ptm->tm_sec; 
int iMilliSec = tvTime.tv_usec/1000; 
int iMicroSec = tvTime.tv_usec; 
Problemi correlati