# Getting current time with milliseconds

I am looking for a more efficient or shorter way to achieve the following output using the following code:

timeval curTime;
gettimeofday(&curTime, NULL);
int milli = curTime.tv_usec / 1000;

time_t rawtime;
struct tm * timeinfo;
char buffer [80];

time(&rawtime);
timeinfo = localtime(&rawtime);

strftime(buffer, 80, "%Y-%m-%d %H:%M:%S", timeinfo);

char currentTime[84] = "";
sprintf(currentTime, "%s:%d", buffer, milli);
printf("current time: %s \n", currentTime);


Sample output:

current time: 2012-05-16 13:36:56:396

I would prefer not to use any third-party library like Boost.

• You want to use %03d to format milli so you get leading zeros. And since your format is so close to ISO-8601, you might want to continue with it and use "." instead of ":" to separate the seconds and milliseconds. – xan May 24 '12 at 0:49

When you call gettimeofday it gives you the number of seconds since EPOCH too, so you don't need to call time again. And when you use output of localtime as input of strftime, you may omit the intermediate variable (not a very useful point though). So your code could be written like:

timeval curTime;
gettimeofday(&curTime, NULL);
int milli = curTime.tv_usec / 1000;

char buffer [80];
strftime(buffer, 80, "%Y-%m-%d %H:%M:%S", localtime(&curTime.tv_sec));

char currentTime[84] = "";
sprintf(currentTime, "%s:%03d", buffer, milli);
printf("current time: %s \n", currentTime);


an important note to be considered is that functions like localtime are not thread-safe, and you'd better use localtime_r instead.

• It's worth to note that on Windows timeval::tv_sec is a long, while localtime expects a time_t. You might want explicitly convert it to the right type first. – Kentzo Feb 28 '18 at 7:46
• sprintf(currentTime, "%s:%d", buffer, milli); will be wrong when milli<100. Use "%s:03d" to add zero-padding. – michaelmoo Jan 22 '19 at 21:51
• @michaelmoo Perhaps it should be "%s:%03d" :) – Cnly Jan 8 '20 at 17:40