Search code examples
ctimec99strftime

Formatted elapsed time in C


I'm writing a function that, among other things, must print out an elapsed time counter. It receives by reference a start time _start, and compares it to current, both typed as time_t. I want to use strftime() to print out the observed time delta in ISO 8601 format. Here's what I attempted to do:

// Negative start time implies program has not begun
if (*_start > 0) {
    time_t elapsed = current - *_start;
    strftime(time_str, sizeof(time_str) - 1, "%T", localtime(&elapsed));
    printf("%s\n", time_str);
}

And here is the output I get immediately after running the program

01:00:00
01:00:00
01:00:01
01:00:01
01:00:01

The seconds work fine, if I let it run longer they get incremented as expected, so do the minutes, however the hour starts as 01 as opposed to 00. Why is this happening? How can I get the hours to start zeroed, like the minutes?


Solution

  • time_t typically (see edit) stores absolute timestamps (the number of seconds since midnight UTC, January 1, 1970). By calculating current - *_start, you're getting elapsed time in seconds (as desired), but by then passing that to localtime and strftime, you're telling the computer to take the time elapsed since the start of your program and treat it as the time elapsed since midnight UTC 1-1-1970.

    I'm guessing that happens to be 01:00:00 in your system's local time zone.

    I'm not aware of a C99 function to print elapsed time, but it's not hard to write one yourself.

    void format_elapsed_time(char *time_str, int total_seconds_elapsed) {
        int hours_elapsed = total_seconds_elapsed / 3600;
        int minutes_elapsed = (total_seconds_elapsed % 3600) / 60;
        int seconds_elapsed = total_seconds_elapsed % 60;
        sprintf(time_str, "%02i:%02i:%02i", hours_elapsed, minutes_elapsed, seconds_elapsed);
    }
    

    Edit: As @chux points out, time_t doesn't have to store timestamps as seconds since 1-1-1970. See this answer for details.