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.

  • saeedn

    saeedn Correct answer

    9 years ago

    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.

    `sprintf(currentTime, "%s:%d", buffer, milli);` will be wrong when milli<100. Use `"%s:03d"` to add zero-padding.

    @michaelmoo Perhaps it should be `"%s:%03d"` :)

License under CC-BY-SA with attribution


Content dated before 7/24/2021 11:53 AM

Tags used