How to calculate relative past time from a given date & time (e.g., 3 hours ago, 5 days ago, a month ago) in C

1 Answer

0 votes
#include <stdio.h>
#include <time.h>
#include <math.h>

const char* ToRelativePastTime(time_t past, char* buffer, size_t size) {
    time_t now = time(NULL);
    double delta = fabs(difftime(now, past));

    long seconds = (long)delta;
    long minutes = seconds / 60;
    long hours   = seconds / 3600;
    long days    = seconds / 86400;

    if (seconds < 60) {
        if (seconds == 1)
            snprintf(buffer, size, "one second ago");
        else
            snprintf(buffer, size, "%ld seconds ago", seconds);
        return buffer;
    }

    if (seconds < 3600) {
        if (minutes == 1)
            snprintf(buffer, size, "a minute ago");
        else
            snprintf(buffer, size, "%ld minutes ago", minutes);
        return buffer;
    }

    if (seconds < 86400) {
        if (hours == 1)
            snprintf(buffer, size, "an hour ago");
        else
            snprintf(buffer, size, "%ld hours ago", hours);
        return buffer;
    }

    if (seconds < 2592000) { // 30 days
        if (days == 1)
            snprintf(buffer, size, "yesterday");
        else
            snprintf(buffer, size, "%ld days ago", days);
        return buffer;
    }

    if (seconds < 31104000) { // 12 months
        int months = (int)floor(days / 30.0);
        if (months <= 1)
            snprintf(buffer, size, "a month ago");
        else
            snprintf(buffer, size, "%d months ago", months);
        return buffer;
    }

    int years = (int)floor(days / 365.0);
    if (years <= 1)
        snprintf(buffer, size, "a year ago");
    else
        snprintf(buffer, size, "%d years ago", years);

    return buffer;
}

int main(void)
{
    char buf[64];
    time_t now = time(NULL);

    time_t tests[] = {
        now - 36,            // 36 seconds
        now - 12*60,         // 12 minutes
        now - 3*3600,        // 3 hours
        now - 25*3600,       // 25 hours
        now - 15*86400,      // 15 days
        now - 30*86400,      // 1 month
        now - 90*86400,      // 3 months
        now - 365*86400,     // 1 year
        now - 11*365*86400   // 11 years
    };

    for (int i = 0; i < 9; i++) {
        printf("%s\n", ToRelativePastTime(tests[i], buf, sizeof(buf)));
    }

    return 0;
}


/*
run:

36 seconds ago
12 minutes ago
3 hours ago
yesterday
15 days ago
a month ago
3 months ago
a year ago
11 years ago

*/

 



answered Apr 13 by avibootz

Related questions

...